Django筛选器,如果字段不是None

时间:2019-05-19 12:06:52

标签: python django

我有一个可以设置expire_date的模型。 我要过滤模型,当设置了expire_date时,如果expire_date比现在低,则应该过滤。

我尝试将其与Case和When一起使用,但是无法在When函数中进行过滤,可以吗?

News.objects.all().annotate(is_expired=Case(When(F("expire_date") != None, then=False if F("expire_date") <= datetime.now() else True))).filter(is_expired=False)

1 个答案:

答案 0 :(得分:1)

可以,condition应该是Q对象,或者通过命名参数指定条件:

from django.db.models import BooleanField, Case, Q, When

News.objects.annotate(
    is_expired=Case(
        When(
            condition=Q(expire_date__isnull=True) | Q(expire_date__gte=datetime.now()),
            then=True
        ),
        default=False,
        output_field=BooleanField()
    )
).filter(is_expired=False)

您不能使用三元运算符等编写Python代码,然后希望将其自动转换为SQL查询。

话虽如此,在这里您只需过滤注释,就可以这样写:

News.objects.filter(Q(expire_date__isnull=True) | Q(expire_date__gte=datetime.now()))

因此,这将包括所有New个对象,其中expire_date等于NULL,或者其中expire_date大于或等于datetime.now()。您的答案中的逻辑没有多大意义,因为它会用所有非空is_expired都为null或expire_date小于 expre_date >超过当前时间。