DRF Django Serializer如何获取多对多关系的扁平化属性值列表
有三种常用的实现方式,可根据实际业务场景选择:
方案1:直接用ListField+ORM values_list(最简单,推荐)
不需要复用BarSerializer的场景下直接修改FooSerializer字段定义即可:
class FooSerializer(serializers.ModelSerializer): # 直接通过ORM的values_list拉平获取所有关联Bar的example字段值 testing = serializers.ListField( child=serializers.CharField(), source="bars.values_list('example', flat=True)", read_only=True ) class Meta: model = Foo fields = "__all__"
注意:你原有代码里
source=bars是错误写法,source参数需要传入字符串类型的字段名/ORM调用表达式。
方案2:用SerializerMethodField自定义取值逻辑
需要额外处理字段值的场景下用这个方案灵活性更高:
class FooSerializer(serializers.ModelSerializer): testing = serializers.SerializerMethodField(read_only=True) def get_testing(self, obj): # 遍历所有关联的Bar对象,可自行添加过滤、格式转换等逻辑 return [bar.example for bar in obj.bars.all()] class Meta: model = Foo fields = "__all__"
方案3:重写BarSerializer的序列化输出逻辑
如果BarSerializer在其他业务场景也需要返回纯字符串值,可以修改序列化器的默认输出规则:
class BarSerializer(serializers.ModelSerializer): class Meta: model = Bar fields = ["example"] # 重写序列化方法,直接返回example字段值,不再包裹为字典 def to_representation(self, instance): return instance.example class FooSerializer(serializers.ModelSerializer): testing = BarSerializer(many=True, source="bars", read_only=True) class Meta: model = Foo fields = "__all__"
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

