django orm的Q和~Q的数据相加并不一定等于总数

以下代码纯粹是为了举例子,并假设sex性别字段可以为NULL, 实际上不会这么写

python 复制代码
all_count = Students.objects.all().count()  # 1000

# 男性数量
male_count = Students.objects.filter(sex='男')  #  600
# 非男性数量
female_count = Students.objects.filter(~Q(sex='男'))  #  300

本义是获取非男性的学生数量, 但是发现他们加起来的数量并不是总数1000,

于是定位问题,发现存在为NULL的情况,性别信息缺失导致该字段可能为NULL, 在sql语句中,NULL不是一个实际的值,它不能直接用于比较操作,如使用=号判断,如果你想检查一个字段是否为NULL,你应该使用IS NULL 或 IS NOT NULL来判断统计,而在Django orm中可以做如下修改:

非男性数量

python 复制代码
female_count = Students.objects.filter(~Q(sex='男') | Q(sex=None))  # 400
相关推荐
丁丁点灯o15 分钟前
Oracle中使用外键的场景及不适用外键的情况
数据库·oracle
天天进步201521 分钟前
Pixelle-Video 源码解析 #18:声音克隆功能:参考音频如何影响解说效果?
数据库·音视频
不懂的浪漫1 小时前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库
布莱克6051 小时前
Redis 详解:从核心数据结构到高可用架构
数据库
冰暮流星2 小时前
mysql之左外连接与右外连接
数据库·sql
jyOverQ2 小时前
MySQL 联合索引怎么用?最左匹配原则到底是什么意思?
数据库·mysql
oradh2 小时前
Oracle enq: US - contention 等待事件总结
数据库·oracle
qq_22589174663 小时前
基于Python+Django的LangGraph智能旅游规划系统
python·django·旅游
姚不倒3 小时前
etcd 学习系列(一):从业务需求出发,理解 etcd 是什么
运维·数据库·etcd
susplus3 小时前
【linux应用软件编程】数据库sqlite3
linux·数据库·sqlite