Django序列化器查询深层嵌套关联字段 如何实现指定Post返回结构
实现方案
你需要的跨多层关联序列化可以通过SerializerMethodField实现,这是最直接的适配方案:
1. 编写序列化器
from rest_framework import serializers from .models import Post class PostSerializer(serializers.ModelSerializer): members = serializers.SerializerMethodField() class Meta: model = Post fields = ['id', 'file', 'members'] def get_members(self, obj): # 沿关联链查询对应 workspace 下所有成员的 user_id return list(obj.file.folder.workspace.members.values_list('user_id', flat=True))
默认情况下ModelSerializer对外键字段会直接返回关联主键,所以file字段不需要额外配置即可符合你要求的返回格式。
2. 查询集优化(避免N+1查询问题)
上述写法如果直接用默认查询集会产生大量重复查询,视图中查询Post时需要提前关联加载嵌套字段:
from .models import Post from rest_framework import viewsets class PostViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = PostSerializer queryset = Post.objects.select_related( "file__folder__workspace" ).prefetch_related( "file__folder__workspace__members" )
SlugRelatedField不生效的原因
SlugRelatedField仅支持当前模型的直接正向/反向关联字段,你的需求中members是跨了4层关联的间接属性,没有直接的关联关系绑定到Post模型上,所以无法直接用SlugRelatedField实现。
内容的提问来源于stack exchange,提问作者Jonathan Aplacador
相关产品推荐
相关产品推荐

