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

DRF中Contact模型自关联多对多friends字段如何序列化获取指定字段

实现方案

步骤1:定义好友嵌套序列化器

新增一个专门序列化好友Contact对象的序列化器,按需提取字段:

from rest_framework import serializers
from .models import Contact

class FriendSerializer(serializers.ModelSerializer):
    # 映射关联用户的id和用户名字段
    user_id = serializers.IntegerField(source='user.id', read_only=True)
    username = serializers.CharField(source='user.username', read_only=True)

    class Meta:
        model = Contact
        # 对应你需要的三个字段:好友Contact的id、关联用户id、关联用户名
        fields = ['id', 'user_id', 'username']

步骤2:修改原ContactSerializer的friends字段

将friends字段指定为上面定义的FriendSerializer,适配多对多关系:

class ContactSerializer(serializers.ModelSerializer):
    # 多对多字段需要指定many=True,read_only=True表示该字段仅用于序列化输出
    friends = FriendSerializer(many=True, read_only=True)

    class Meta:
        model = Contact
        # 这里其他你需要返回的字段可以自行补充,比如当前联系人的user信息等
        fields = ['id', 'user', 'friends']

可选优化:避免N+1查询

修改视图的queryset,预加载关联的friends和对应user数据,大幅提升接口响应效率:

class ContactAPIView(generics.RetrieveAPIView):
    # 预加载关联数据,避免序列化时重复查询数据库
    queryset = Contact.objects.all().prefetch_related('friends', 'friends__user')
    serializer_class = ContactSerializer
    lookup_field = 'user__username'

修改完成后,接口返回的friends字段会是你需要的结构,示例格式如下:

{
  "id": 1,
  "user": 1,
  "friends": [
    {"id": 2, "user_id": 3, "username": "userA"},
    {"id": 5, "user_id": 6, "username": "userB"}
  ]
}

内容的提问来源于stack exchange,提问作者Juan Andrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:09:00