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
相关推荐
小吴编程之路10 小时前
MySQL 索引核心特性深度解析:从底层原理到实操应用
数据库·mysql
~莫子10 小时前
MySQL集群技术
数据库·mysql
凤山老林10 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
就不掉头发11 小时前
Linux与数据库进阶
数据库
与衫11 小时前
Gudu SQL Omni 技术深度解析
数据库·sql
wefly201711 小时前
开发者效率神器!jsontop.cn一站式工具集,覆盖开发全流程高频需求
前端·后端·python·django·flask·前端开发工具·后端开发工具
咖啡の猫11 小时前
Redis桌面客户端
数据库·redis·缓存
oradh11 小时前
Oracle 11g数据库软件和数据库静默安装
数据库·oracle
what丶k11 小时前
如何保证 Redis 与 MySQL 数据一致性?后端必备实践指南
数据库·redis·mysql
_半夏曲11 小时前
PostgreSQL 13、14、15 区别
数据库·postgresql