Django中SQLite实现左连接查询含0值的国家人口总和
解决Django查询国家人口总和时缺失无数据国家的问题
这个问题我做项目时也碰到过,你当前的查询逻辑是从State(看你代码里写的City应该是笔误啦,对应你的state表应该用State模型)出发做聚合,本质是内连接,只会返回存在关联State数据的国家,像c这种没有任何州/省数据的自然就被过滤掉了。
要解决这个问题,我们需要从Country模型出发做左连接查询,确保所有国家都被包含,再用Coalesce函数把空的人口总和转为0,具体实现如下:
正确的查询代码
from django.db.models import Sum, Value from django.db.models.functions import Coalesce # 从Country模型出发,左关联State并聚合人口总和,空值替换为0 countries_population = Country.objects.annotate( total_pop=Coalesce(Sum('state__population'), Value(0)) ).values('name', 'total_pop')
代码解释
- 从
Country模型开始查询:这样会默认包含所有国家记录,不管有没有对应的State数据 Coalesce函数:用来处理聚合后返回的None值(也就是没有任何State的国家),把它替换成我们指定的Value(0)Sum('state__population'):通过外键关联,对每个国家下的所有State的population字段求和
格式化为你需要的字符串
拿到查询结果后,我们可以快速拼接成你要的格式:
result = ", ".join([f"{item['name']}有{item['total_pop']}人口" for item in countries_population]) print(result) # 输出结果:A有236688人口,b有8471110人口,c有0人口
这样就能完美包含所有国家,包括没有任何州/省数据的c啦~
内容的提问来源于stack exchange,提问作者Jaskaran singh Rajal
相关产品推荐
相关产品推荐

