Django Rest Framework如何将序列化返回的对象列表扁平化为字符串列表
实现方案
你可以通过以下两种常用方式实现扁平化的ID数组返回,同时可搭配性能优化配置避免额外查询开销:
方案1:使用SerializerMethodField(最简洁直观)
直接在用户序列化器中自定义字段取值逻辑,无需额外定义嵌套的关联序列化器:
from rest_framework import serializers from .models import MyUser class BulkQualificationSerializer(serializers.ModelSerializer): qualifications = serializers.SerializerMethodField() class Meta: model = MyUser fields = ["qualifications"] def get_qualifications(self, obj): # 直接遍历关联数据返回ID字符串列表 return [str(qual.qualification.id) for qual in obj.qualifications.all()]
方案2:重写嵌套序列化器的to_representation方法
如果要保留独立的关联序列化器复用逻辑,可以修改子序列化器的返回格式:
from rest_framework import serializers from .models import MyUser, MyUserQualification class MyUserQualificationBulkSerializer(serializers.ModelSerializer): class Meta: model = MyUserQualification fields = [] def to_representation(self, instance): # 直接返回ID字符串,替代默认的字典结构 return str(instance.qualification.id) class BulkQualificationSerializer(serializers.ModelSerializer): qualifications = MyUserQualificationBulkSerializer( many=True, read_only=True, ) class Meta: model = MyUser fields = ["qualifications"]
可选性能优化
为了避免N+1查询问题,建议修改视图的查询集,提前预加载关联数据:
from django.db.models import Prefetch from rest_framework import generics from .models import MyUser, MyUserQualification from .serializers import BulkQualificationSerializer class MyUserDetail(generics.RetrieveAPIView): lookup_field = "email" queryset = MyUser.objects.prefetch_related( Prefetch("qualifications", queryset=MyUserQualification.objects.select_related("qualification")) ).all() serializer_class = BulkQualificationSerializer
注意:你的原有代码中存在模型类名拼写错误(
myUserQualification应为MyUserQualification、myUser应为MyUser),调整时请同步修正。
内容的提问来源于stack exchange,提问作者zigzagzoom
相关产品推荐
相关产品推荐

