Django能否对非数值字段的长度进行求和?
Django中非数值字段长度求和实现
当然可以实现对CharField或JSONField这类非数值字段的长度求和,核心思路是先用Django的数据库函数获取字段的长度值,再通过Sum聚合函数求和,具体操作分两种场景:
1. 对CharField的长度求和
使用Length函数提取字符串字段的长度,再嵌套到Sum中完成聚合:
from django.db.models import Sum from django.db.models.functions import Length # 计算所有用户username字段的总长度 total_username_length = User.objects.aggregate(total_length=Sum(Length('username')))['total_length']
Length函数会将每条数据的username长度转为数值,Sum再对这些数值求和,最终从聚合结果的字典中取出总长度值。
2. 对JSONField的长度求和
Django 3.1及以上版本提供了JSONLength函数,可统计JSON字段的元素数量(数组)或键值对数量(对象),用法类似:
from django.db.models import Sum from django.db.models.functions import JSONLength # 计算所有用户user_data字段的总长度(数组元素数/对象键值对数) total_json_length = User.objects.aggregate(total_length=Sum(JSONLength('user_data')))['total_length'] # 如果要统计JSON嵌套字段的长度,可指定路径 total_nested_length = User.objects.aggregate(total_length=Sum(JSONLength('user_data__profile__nickname')))['total_length']
兼容老版本Django
如果你的Django版本不支持JSONLength,可以用RawSQL直接调用数据库原生函数,比如PostgreSQL的jsonb_length:
from django.db.models import Sum, RawSQL total_json_length = User.objects.aggregate( total_length=Sum(RawSQL("jsonb_length(user_data)", [])) )['total_length']
内容的提问来源于stack exchange,提问作者haojie
相关产品推荐
相关产品推荐

