You need to enable JavaScript to run this app. 如何使用Django QuerySet的exclude方法排除空值和全零JSON字段数据
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:21:02