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
相关推荐
添砖java‘’18 分钟前
MYSQL数据类型
数据库·mysql
qq_3721542322 分钟前
如何配置表中某列的排序权重_全文索引配置与权重分配
jvm·数据库·python
2501_9142459333 分钟前
CSS如何使用-nth-of-type精确选择列表项_通过元素类型限制提升样式健壮性
jvm·数据库·python
吕源林40 分钟前
Golang如何做本地缓存加速_Golang本地缓存教程【核心】
jvm·数据库·python
Magic@1 小时前
Redis学习[1] ——基本概念和数据类型
linux·开发语言·数据库·c++·redis·学习
你觉得脆皮鸡好吃吗1 小时前
SQL注入 基础防御
数据库·sql
池佳齐1 小时前
软考高级系统架构设计师备考(十九):数据库系统—数据库设计
数据库·系统架构
_Evan_Yao1 小时前
缓存金字塔上的红色闪电:Redis 如何借力 CPU 的 L1/L2/L3 与 TLB 飞驰
java·数据库·redis·后端·缓存
Teable任意门互动1 小时前
多维表格哪家最好用最容易上手?国产开源 Teable 测评
开发语言·数据库·开源·excel·飞书·开源软件
weixin_381288181 小时前
Layui怎么在表格标题栏中嵌入一个迷你的HTML搜索表单
jvm·数据库·python