Django 复杂查询
Posted
技术标签:
【中文标题】Django 复杂查询【英文标题】:Django complex queries 【发布时间】:2011-06-08 16:56:51 【问题描述】:我需要为检查日期范围的对象制作过滤器。现在我正在执行一个非常低效的循环来检查所有对象。我想将其简化为数据库调用。
逻辑是你有一个start
和一个end
日期对象。我需要检查开始或结束是否在约会范围内。
if (start >= appointment.start && start < appointment.end) ||
(end > appointment.start && end <= appointment.end)
我可以在 SQL 中执行此操作,但我对更复杂查询的 Django 模型结构不太熟悉。
【问题讨论】:
【参考方案1】:& 和 OR 运算符以及 range
字段查找类型需要 Q 对象
Q 对象:http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects
范围:http://docs.djangoproject.com/en/dev/ref/models/querysets/#range
Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) |
Q(end__range=(appointment.start, appointment.end)))
如果 SQL BETWEEN
不是您正在寻找的,您始终可以使用 Q 对象的特定组合来准确重现您的条件:
Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) |
(Q(end__gt=appointment.start) & Q(end__lte=appointment.end)))
【讨论】:
使用第一个例子,你在哪里使用start_date
和end_date
?
对不起乔希!最初的示例直接来自文档,然后在以后的更新中我采用了您的特定变量:) 我将删除那些以上是关于Django 复杂查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 1.9 中查询复杂的 JSONB 字段