我有一个可以设置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)
答案 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 >超过当前时间。