如何在Django QuerySet中新增布尔字段判断geo字段是否均已赋值
实现方案
首先导入需要的ORM工具类:
from django.db.models import Case, When, Value, BooleanField, Q, ExpressionWrapper
写法1:兼容所有Django版本的通用写法
通过annotate + Case/When条件分支实现需求,完整查询代码如下:
queryset = Address.objects.annotate( has_geo_info=Case( When( Q(geo_lat__isnull=False) & Q(geo_lng__isnull=False), then=Value(True) ), default=Value(False), output_field=BooleanField() ) )
- 新增的字段名为
has_geo_info,可根据业务需求自行修改 - 该写法不会过滤原有查询结果,所有地址条目都会完整保留
- 可以直接通过返回的模型实例访问该字段:
address.has_geo_info会返回对应的布尔值
如果你模型中的
geo_lat、geo_lng字段是通过空字符串而非null表示未赋值,将判断条件里的__isnull=False替换为__exact!=''即可。
写法2:Django 3.2+ 简化写法
3.2及以上版本的Django支持直接将Q查询表达式作为判断条件,代码更简洁:
queryset = Address.objects.annotate( has_geo_info=ExpressionWrapper( Q(geo_lat__isnull=False) & Q(geo_lng__isnull=False), output_field=BooleanField() ) )
两种写法的执行效果完全一致,你可以根据自己项目的Django版本选择。
内容的提问来源于stack exchange,提问作者Spirconi
相关产品推荐
相关产品推荐

