Django用Q过滤不交集

时间:2018-11-08 16:21:41

标签: django django-orm

我的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

0 个答案:

没有答案