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)
解决方案
您可以,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
的 s 对象。您的答案中的逻辑没有多大意义,因为它会用所有为 null 或 where小于当前时间的非 null s 进行注释。expire_date
NULL
expire_date
datetime.now()
is_expired
expire_date
expre_date
推荐阅读
- html - 如何在悬停时实现这种“下划线”效果,用完了选项
- amazon-web-services - AWS Redshift Data API 为 executeStatement 使用了错误的端口
- ios - 播放歌曲时播放/暂停按钮不更新
- javascript - 连接到我的商店时收到错误消息!*第一次尝试实现 Redux*
- vue.js - 让文本框在更改时变为红色
- javascript - 将全局附加到 Vue 实例
- node.js - 在 Firebase Admin 中验证无密码电子邮件注册
- intellij-idea - 如何在 IntelliJ 中过滤 UML 图以仅显示特定类及其传递依赖项?
- apache - htaccess 404 仅适用于文件级别,但不适用于文件夹级别
- reactjs - 在 ReactJS 中自动将添加的数据反映到表中