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

标签 django django-queryset django-orm

我有以下两个模型:

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_datereturn_date。如果因此存在这样的TourDatesInfo,它将返回Tour数据。 .distinct() call [Django-doc]用于防止返回相同的 Tour 的次数与匹配的 TourDatesInfo 的次数相同。

关于django - 如何根据反向外键相关模型的字段过滤QuerySet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71578998/

相关文章:

具有条件的相关对象的 Django 计数

python - Django 自定义注解函数

python - Nginx 不为 Django 提供静态文件

python - 使用 Nginx 和 Django 设置 Unix Socket

javascript - 如何将 javascript 变量中的信息添加到 Django ModelForm 输入中?

django:基于时间范围的聚合查询

python - Django:通过注释字段的总和来排序查询集?

Django模型字段: Ordered List of Foreign Keys

python - Django 条件创建

python - 在单个项目中重用 Django 应用程序