我的Django模型中有一个方法可以按日期范围过滤相关对象:
from django.db import models
from django.db.models import Q
class Foo(models.Model):
# (...)
def get_bar_from_range(date_from=None, date_until=None):
query_from = Q()
query_until = Q()
if date_from is not None:
query_from = Q(date__gte=date_from)
if date_until is not None:
query_until = Q(date__lte=date_until)
# I have to check whether date_from is greater than date_until
if date_from > date_until: # !!!
query = query_from | query_until
else:
query = query_from & query_until
return self.bar_set.filter(query)
class Bar(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
date = models.DateTimeField(null=True)
它可以过滤联合和不联合的时间段。
<-------+ +------->
| |
------------x-------------x----------------->
date_until date_from
+-------------+
| |
------------x-------------x------------------>
date_from date_until
我不能只做self.bar_set.filter(query_from, query_until)
。
我猜默认情况下Django将查询与'AND'联接在一起。我有什么办法不必手动检查date_from
是否大于date_until
?