使用Django ORM进行简短记录查询

时间:2014-05-08 16:53:59

标签: django django-models django-queryset django-orm

我可以修改以下查询,使其使用Django ORM更简洁吗?

queryset.filter((Q(from_date__lte=from_date) & \
                 Q(to_date__gt=from_date)) | \
                (Q(from_date__lte=to_date) & 
                 Q(to_date__gt=to_date)))

以下是一些例子:

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00",

"from_date": "2014-05-12 12:00:00", 
"to_date": "2014-05-12 15:00:00",

这些是数据库中的日期

如果您提交

fromDate=2014-05-11 08:00:00
toDate=2014-05-11 13:00:00

应该只给我第一个日期

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00",

这里再次,应该只给我第一个结果

fromDate=2014-05-11 09:00:00
toDate=2014-05-11 13:00:00

如果我提交以下日期

fromDate=2014-05-11 07:00:00
toDate=2014-05-11 09:00:00

同样,只应采取第一个结果

如果你这样做,你可以得到两个结果

fromDate=2014-05-11 09:00:00
toDate=2014-05-12 13:00:00

我希望你明白这个想法是什么。

查询应保持相同的逻辑!

1 个答案:

答案 0 :(得分:1)

queryset.filter(to_date__gt=from_date, from_date__lt=to_date)

也就是说,要返回,事件必须在新事件开始后结束,并且必须在新事件结束之前开始。任何在新的from_date之前结束的内容都不会被返回,也不会在它结束之后才开始。

这与原始查询不完全匹配,但它确实与评论中描述的行为相匹配,因为数据库中的记录完全在新日期设置的范围内。