我不知道如何使用 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)
我想做出以下选择:
- 使用 start_date 和 end_date 过滤器获取所有时间段
- 通过项目过滤器获取相关生产(如果该特定时期存在的话)
将其传递给 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/