Вы можете, condition
должен быть Q
объектом, или вы указываете условие через именованные параметры:
from django.db.models import BooleanField, Case, Q, When
News.objects.annotate(
is_expired=Case(
When(
<b>condition=Q(expire_date__isnull=True) | Q(expire_date__gte=datetime.now())</b>,
then=True
),
default=False,
output_field=BooleanField()
)
).filter(is_expired=False)
Вы не можете писать код Python с троичными операторами и т. Д., А затем надеяться, что он автоматически преобразуется в запрос SQL.
Как говорится, здесь вы просто фильтруете аннотацию, так что вы можете просто написать это как:
News.objects.filter(<b>Q(expire_date__isnull=True) | Q(expire_date__gte=datetime.now())</b>)
это, таким образом, будет включать все New
s объекты с expire_date
, равным NULL
, или где expire_date
больше или равно datetime.now()
. Логика в вашем ответе не имела особого смысла, так как она аннотировала бы is_expired
со всеми ненулевыми expire_date
с нулями или где expre_date
на меньше , чем текущее время.