Django DRF ModelViewSet 如何在返回外键id同时展示指定关联属性
实现方案
你只需要修改PetSerializer和PetViewSet即可实现需求,步骤如下:
1. 常规实现(输出字段名不带空格,推荐)
这种写法性能更高,代码更简洁:
# 修改序列化器 class PetSerializer(serializers.ModelSerializer): # 新增两个只读字段,通过source参数跨关联表取对应属性 breed_name = serializers.CharField(source='breed.name', read_only=True) animal_name = serializers.CharField(source='breed.animal.name', read_only=True) class Meta: model = Pet fields = "__all__" # 也可以显式指定返回字段,控制返回内容更精准 # fields = ['id', 'name', 'breed', 'breed_name', 'animal_name']
# 修改ViewSet优化查询,避免N+1问题 class PetViewSet(viewsets.ModelViewSet): # 预加载关联的breed和animal数据,减少数据库查询次数 queryset = Pet.objects.select_related('breed', 'breed__animal').all() serializer_class = PetSerializer
2. 输出带空格的字段名(匹配你示例中的breed name、animal name格式)
因为Python变量名不允许包含空格,可以重写序列化器的to_representation方法实现:
class PetSerializer(serializers.ModelSerializer): class Meta: model = Pet fields = "__all__" def to_representation(self, instance): data = super().to_representation(instance) # 新增带空格的自定义字段 data['breed name'] = instance.breed.name data['animal name'] = instance.breed.animal.name return data
ViewSet的优化逻辑和上面一致,不需要修改。
效果验证
修改完成后调用GET接口,就会在保留原有breed外键ID的基础上,额外返回你需要的两个字段,不会输出Breed和Animal的其他属性。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

