如何根据反向外键相关模型的字段过滤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 对,例如,获取至少有一个 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(
<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_date
和 return_date
上进行过滤。如果因此有这样的TourDatesInfo
,它会return Tour
数据。 .distinct()
call [Django-doc] 用于防止 return 对相同的 Tour
进行多次匹配 TourDatesInfo
。
我有以下两个模型:
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 对,例如,获取至少有一个 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(
<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_date
和 return_date
上进行过滤。如果因此有这样的TourDatesInfo
,它会return Tour
数据。 .distinct()
call [Django-doc] 用于防止 return 对相同的 Tour
进行多次匹配 TourDatesInfo
。