我需要为检查日期范围的对象设计过滤器。现在我正在执行一个非常低效的循环来检查所有对象。我想将其简化为数据库调用。
逻辑是你有一个start
和一个end
日期对象。我需要检查开始或结束是否在预约范围内。
if (start >= appointment.start && start < appointment.end) ||
(end > appointment.start && end <= appointment.end)
我可以在SQL中执行此操作,但我对Django模型结构并不熟悉更复杂的查询。
答案 0 :(得分:4)
你需要Q对象和&amp;和OR运算符以及range
字段查找类型
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)))