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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:15:04