You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:15:02