我有以下两个模型:
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(
<strong>dates__departure_date__gt</strong>='2022-04-12',
<strong>dates__return_date__lt</strong>='2022-05-01'
)<strong>.distinct()</strong>
这将在 TourDatesInfo
模型的表上创建一个 JOIN
,并过滤 departure_date
和 return_date
。如果因此存在这样的TourDatesInfo
,它将返回Tour
数据。 .distinct()
call [Django-doc]用于防止返回相同的 Tour
的次数与匹配的 TourDatesInfo
的次数相同。
关于django - 如何根据反向外键相关模型的字段过滤QuerySet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71578998/