Django 左连接或模拟

标签 django django-orm

我不知道如何使用 Django ORM 进行左连接,请参阅下面的案例。

我的模型是(请不要介意母语):

class Production(models.Model):
    '''Выработка.'''
    project = models.ForeignKey(
        Project, on_delete=models.PROTECT, verbose_name='проект')
    timeperiod = models.ForeignKey(
        Timeperiod, on_delete=models.PROTECT, verbose_name='период')
    time = models.DurationField('трудочасы')
    amount = models.DecimalField('выработка', max_digits=10, decimal_places=2)
    note = models.TextField('заметка', blank=True, null=True)
    is_auto = models.BooleanField(
        'признак автоматического расчета', default=False)

class Timeperiod(models.Model):
    '''Периоды.'''
    start_date = models.DateField('дата начала')
    end_date = models.DateField('дата окончания')
    target_duration = models.DurationField('длительность')
    is_open = models.BooleanField('открыт', default=True)

我想做出以下选择:

  1. 使用 start_date 和 end_date 过滤器获取所有时间段
  2. 通过项目过滤器获取相关生产(如果该特定时期存在的话)

将其传递给 template_processor 并将其呈现为表格(在 for 循环中)

我知道如何过滤查询集,并且知道如何获取相关查询集,但我不明白如何过滤我的相关查询集

更新

我想要的查询集应该像这个 SQL 查询一样:

SELECT * 
FROM collector_timeperiod tp
LEFT JOIN collector_production AS p ON p.timeperiod_id = tp.id 
                                    AND p.project_id = 3

最佳答案

您可以使用timeperiod__…过滤相关模型,例如:

Production.objects.filter(
    <strong>timeperiod__</strong>start_date__gte='2022-3-1',
    <strong>timeperiod__</strong>end_date__lte='2022-3-31'
)

或者如果您想检索项目:

Project.objects.filter(
    <strong>production__timeperiod__</strong>start_date__gte='2022-3-1',
    <strong>production__timeperiod__</strong>end_date__lte='2022-3-31'
).distinct()

.distinct() call [Django-doc]将避免多次检索相同的 Project,因为存在匹配的 Timeperiod

关于Django 左连接或模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71673754/

相关文章:

Python Django 媒体 url 在设置 DEBUG = True 后不起作用

django 内连接查询

Django ORM,多列的总和

django - 通过过滤对象列表来获取对象列表

python - 如果设置为 null,如何创建具有默认值的 Django 模型字段

Django,如何在没有 for 循环的情况下解析单个表单字段(HTML)

python - tastypie 在使用限制偏移量时返回重复对象

python - 从 Django 的 raw() 查询函数中获取结果数

python - 是否有用于查询嵌套 jsonfield 键的 django-orm 查找?

python-3.x - 如何使用django Rest框架删除self forienkey中最多n种类型的数据?