Django复杂的查询

时间:2011-01-13 18:42:35

标签: python sql django model date

我需要为检查日期范围的对象设计过滤器。现在我正在执行一个非常低效的循环来检查所有对象。我想将其简化为数据库调用。

逻辑是你有一个start和一个end日期对象。我需要检查开始或结束是否在预约范围内。

if (start >= appointment.start && start < appointment.end) || 
   (end > appointment.start && end <= appointment.end)

我可以在SQL中执行此操作,但我对Django模型结构并不熟悉更复杂的查询。

1 个答案:

答案 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)))