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
相关产品推荐
相关产品推荐

