如何根据反向外键相关模型的字段过滤QuerySet?

How to filter QuerySet depending on fields of a reverse foreign key related model?

我有以下两个模型:

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 具有一对多关系,因此一次旅行可能有多组不同的 departure/return 日期。

我试图实现的是能够根据 TourDatesInfo 的集合过滤游览 QuerySet,具体取决于每个游览是否包含满足特定条件的 departure/return 对,例如,获取至少有一个 TourDatesInfodeparture_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(
    <strong>dates__departure_date__gt</strong>='2022-04-12',
    <strong>dates__return_date__lt</strong>='2022-05-01'
)<strong>.distinct()</strong>

这将在 TourDatesInfo 模型的 table 上创建一个 JOIN,并在 departure_datereturn_date 上进行过滤。如果因此有这样的TourDatesInfo,它会return Tour 数据。 .distinct() call [Django-doc] 用于防止 return 对相同的 Tour 进行多次匹配 TourDatesInfo