Django复合查询

1 投票
1 回答
1582 浏览
提问于 2025-04-16 09:54

我需要制作一个过滤器,用来检查日期范围。目前我在做一个效率很低的循环,检查所有的对象。我想把这个过程简化成一个数据库的调用。

逻辑是这样的:你有一个 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)))

撰写回答