Django left join или аналог
Я не могу понять, как использовать 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('трудочасы')
ammount = 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)
Я хотел бы сделать следующий выбор:
- Get all the Timeperiod with filters on start_date and end_date
- Get related Production with filter on project (if any exists for this particular period)
Передать его в template_processor и отобразить в виде таблицы (в цикле for loop)
Я знаю, как фильтровать наборы запросов, и знаю, как получить связанные наборы запросов, но я не понимаю, как фильтровать мои ОТНОСИТЕЛЬНЫЕ наборы запросов
Вы можете фильтровать по связанной модели с помощью timeperiod__…, например:
Production.objects.filter(
timeperiod__start_date__gte='2022-3-1',
timeperiod__end_date__lte='2022-3-31'
)
или если вы хотите получить Projects:
Project.objects.filter(
production__timeperiod__start_date__gte='2022-3-1',
production__timeperiod__end_date__lte='2022-3-31'
).distinct()
Вызов .distinct() [Django-doc] позволит избежать получения одного и того же Project столько раз, сколько существует совпадающих Timeperiods.