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)

Я хотел бы сделать следующий выбор:

  1. Get all the Timeperiod with filters on start_date and end_date
  2. 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.

Вернуться на верх