如何使用Django QuerySet的exclude方法排除空值和全零JSON字段数据
实现方法
你可以根据你使用的数据库选择以下两种方案:
方案1:通用正则匹配法(兼容MySQL/PostgreSQL等支持正则的数据库)
这种方法不需要依赖数据库特定的JSON操作函数,通过匹配JSON序列化后的字符串特征,直接筛选出所有值均为0的JSON对象进行排除:
# 基础排除项:空值、0、空字典、仅total为0的JSON base_exclude_items = [0, None, {}, {"total": 0}] # 匹配所有值均为数字0的JSON对象的正则 all_zero_json_regex = r'^\{(\s*"[^"]+"\s*:\s*0\s*,?\s*)*\}$' # 组合条件执行排除 result = B.exclude( mycolumn__in=base_exclude_items ).exclude( mycolumn__regex=all_zero_json_regex )
注意:如果你的JSON字段中存在字符串类型的"0",可以调整正则为r'^\{(\s*"[^"]+"\s*:\s*["]?0["]?\s*,?\s*)*\}$'兼容该场景。
方案2:PostgreSQL专属原生JSON操作法(性能更高)
如果你使用PostgreSQL作为数据库,可以直接利用JSONB的内置函数遍历键值对,判断是否存在非0值,精准度更高:
from django.db.models import Exists, OuterRef # 子查询判断当前JSON字段是否存在非0值 has_non_zero = Exists( B.objects.raw( """ SELECT 1 FROM jsonb_each_text(mycolumn) WHERE value::integer != 0 LIMIT 1 """, params=[OuterRef('pk')] ) ) result = B.exclude( mycolumn__in=[0, None, {}] ).annotate( has_non_zero_value=has_non_zero ).exclude( has_non_zero_value=False )
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

