Как фильтровать QuerySet в зависимости от полей модели, связанной с обратным внешним ключом?

У меня есть две следующие модели:

class Tour(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=3000, blank=True

    # some other fields here

и

class TourDatesInfo(models.Model):
    departure_date = models.DateTimeField()
    return_date = models.DateTimeField()
    tour = models.ForeignKey(Tour, on_delete=models.CASCADE, related_name='dates')
Модель

Tour имеет отношение "один ко многим" с TourDatesInfo, так что один тур может иметь несколько различных наборов дат отправления/возвращения.

Я пытаюсь достичь того, чтобы иметь возможность фильтровать туры QuerySet в зависимости от их набора TourDatesInfo, в частности, от того, содержит ли каждый тур пару отправления/возвращения, удовлетворяющую определенным условиям, например, получить все туры, которые имеют по крайней мере один TourDatesInfo с departure_date > 2022-04-12 и return_date < 2022-05-01.

Я могу написать SQL запрос для выполнения этого, что-то вроде SELECT * FROM tours_tour tours WHERE tours.id IN (SELECT DISTINCT tour_id FROM tours_tourdatesinfo WHERE departure_date > '2022-04-12' AND return_date < '2022-05-01');, но как это можно сделать с помощью django ORM без сырых запросов?

Вы можете фильтровать с помощью:

Tour.objects.filter(
    dates__departure_date__gt='2022-04-12',
    dates__return_date__lt='2022-05-01'
).distinct()

This will make a JOIN on the table of the TourDatesInfo model, and filter on the departure_date and return_date. If there is thus such TourDatesInfo, it will return the Tour data. The .distinct() call [Django-doc] is used to prevent returning the same Tour for as many times as there are matching TourDatesInfos.

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