Django中如何在Serializer统计外键user字段对应的关联对象数量
Django 需求实现方案
方法一:ORM 聚合查询(推荐,性能最优)
直接在数据库层面完成计数,仅执行1次查询,无N+1性能问题。
第一步:构造带计数的查询集
使用Django ORM的annotate方法给每个ABC对象追加计数字段:
from django.db.models import Count from .models import ABC # 注意:你当前给出的模型中ABC的user是单外键,理论上每个ABC仅关联1个User,计数恒为1 # 如果你实际需要统计的是「每个用户关联的ABC总数」,Count内的参数替换为外键设置的related_name即可,例如设置了related_name="abc_list"就写Count('user__abc_list') abc_queryset = ABC.objects.annotate( no_of_user_objects=Count('user') ).values('id', 'no_of_user_objects')
第二步:接口返回示例
如果是原生Django视图,直接返回JsonResponse即可:
from django.http import JsonResponse def abc_list_view(request): abc_queryset = ABC.objects.annotate( no_of_user_objects=Count('user') ).values('id', 'no_of_user_objects') # safe=False 允许返回非字典类型的JSON return JsonResponse(list(abc_queryset), safe=False)
如果使用DRF(Django REST Framework),直接把查询集传给序列化器即可。
方法二:序列化器自定义字段(仅适合小数据量场景)
如果数据量很小(百条以内),不想修改ORM查询,可以在序列化器中自定义字段实现:
from rest_framework import serializers from .models import ABC class ABCSerializer(serializers.ModelSerializer): no_of_user_objects = serializers.SerializerMethodField() class Meta: model = ABC fields = ['id', 'no_of_user_objects'] # 自定义计数逻辑 def get_no_of_user_objects(self, obj): # 替换为你实际需要的计数逻辑即可 return obj.user.abc_set.count()
注意:该方法会产生N+1查询问题,数据量超过100条时性能会大幅下降,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者RoyalBosS
相关产品推荐
相关产品推荐

