You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM中Case/When语句如何正确使用AND条件?

Django ORM里给When条件加AND逻辑的正确做法

你原来用Python的and关键字是错的,Django ORM有自己的逻辑组合方式,两种常用方法:

方法1:逗号分隔多个条件(默认就是AND)

Django ORM中,When里传多个键值对参数时,默认是AND关系,直接分开写就行:

from django.db.models import Case, When
from datetime import datetime

now = datetime.now()
today = now.strftime('%A')  # 假设today是星期字符串,比如"Monday"

q = Food.objects.all().annotate(
    open=Case(
        When(days__day=today, then='blahblah'),
        When(start_time__lte=now, end_time__gte=now, then='blabla'),
        default='closed'  # 建议加default,避免无匹配时返回None
    )
)

方法2:用Q对象显式组合AND

如果要写更复杂的逻辑(比如混着AND/OR),就用Q对象,用&表示AND:

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

now = datetime.now()
today = now.strftime('%A')

q = Food.objects.all().annotate(
    open=Case(
        When(days__day=today, then='blahblah'),
        When(Q(start_time__lte=now) & Q(end_time__gte=now), then='blabla'),
        default='closed'
    )
)

为啥原来的写法没用?

你写的start_time__lte=now and end_time__gte=now是Python的逻辑运算,它会先把两个条件转换成布尔值再做AND,最后把结果当成When的一个参数,这根本不符合Django ORM的查询语法,自然生成不了正确的SQL AND条件。

内容的提问来源于stack exchange,提问作者Setare Kalantari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:07:49