Django复合查询
我需要制作一个过滤器,用来检查日期范围。目前我在做一个效率很低的循环,检查所有的对象。我想把这个过程简化成一个数据库的调用。
逻辑是这样的:你有一个 start
日期和一个 end
日期对象。我需要检查这个开始日期或者结束日期是否在一个预约的范围内。
if (start >= appointment.start && start < appointment.end) ||
(end > appointment.start && end <= appointment.end)
我可以用SQL来实现这个,但我对Django的模型结构不太熟悉,所以在处理更复杂的查询时有点困难。
1 个回答
4
你需要使用Q对象来处理与和(&)或(OR)运算符相关的操作,以及用于range
字段查找类型。
Q对象的详细信息可以查看这里:http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects
关于range的使用,可以参考这个链接: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)))