我有以下两种型号:

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型号之间存在一对多关系,因此一次旅行可能会有多组不同的出发/返回日期.

What I try to achieve is to be able to filter the tours QuerySet depending on their set of TourDatesInfo, preciesely on whether each tour contains departure/return pair that satisfies specific conditions, e.g., get all tours that have at least one TourDatesInfo with 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()

这将在TourDatesInfo型号的表上生成JOIN,并在departure_datereturn_date上进行过滤.如果存在这样的TourDatesInfo,它将返回Tour个数据..distinct() call [Django-doc]用于防止返回相同的Tour的次数与返回匹配的TourDatesInfo的次数相同.

Django相关问答推荐

当RST =True时RST CSS

如果密码在Django中未被散列,则对其进行散列

如何使用Django';S生成的字段来统计相关对象?

Django-HTMX:呈现到不同目标的表单验证错误

新的 Django 开发人员无法在网站上显示Hello World,而不是默认安装成功页面

在 Trunc 的 kind 属性中使用字段

无法使用 django-filters 进行过滤

`.objects` 属性在哪里添加到 Django 的 models.Model 类中的实例命名空间?

lower() 在 None 上被调用

Nginx 响应 404 not found on Django media URL in preprod, dev ok

如何在 ModelViewSet 逻辑中读取查询字符串值?

Django - 强制执行 ManyToManyField 唯一项

jinja2模板引擎中的这个-是做什么的?

Django 模板:通过扩展模板覆盖包含的子模板块

在 django 模板中访问元组

django 管理员操作而不 Select 对象

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

Django 1.7 - 如何 suppress (1_6.W001)某些元素单元测试可能无法按预期执行.?

如何使 Django 的开发服务器公开?

Django 测试客户端方法覆盖标头