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

Django DRF序列化:将IP列表转为字符串列表的实现方案

解决Django序列化多对多IP地址为字符串列表的问题

嘿,我懂你想要把关联的IPAddress对象列表转成纯IP字符串列表的需求,这在Django REST Framework里其实有几种简单的实现方式,我给你整理两种常用方案:

方案一:用SerializerMethodField自定义字段

这是最灵活的方式,能完全控制返回内容:

修改你的HostSerializer代码如下:

class HostSerializer(serializers.ModelSerializer):
    hostname = serializers.CharField(source='name', read_only=True)
    # 自定义ip_addresses字段,返回字符串列表
    ip_addresses = serializers.SerializerMethodField()

    class Meta:
        model = Host
        fields = ['hostname', 'ip_addresses']
        # 这里要去掉depth=1,不然会覆盖我们自定义的字段
        # depth = 1

    def get_ip_addresses(self, obj):
        # 遍历关联的IPAddress对象,提取ip_address字段组成列表
        return [ip.ip_address for ip in obj.ip_addresses.all()]

方案二:使用StringRelatedField简化代码

因为你的IPAddress模型已经重写了__str__方法,返回的就是IP字符串,所以可以直接用DRF提供的StringRelatedField:

class HostSerializer(serializers.ModelSerializer):
    hostname = serializers.CharField(source='name', read_only=True)
    # 用StringRelatedField直接获取对象的字符串表示
    ip_addresses = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:
        model = Host
        fields = ['hostname', 'ip_addresses']
        # 同样要去掉depth=1
        # depth = 1

为什么原来的代码会返回对象列表?

你之前设置的depth=1会告诉DRF递归序列化关联模型,所以它会把每个IPAddress对象完整序列化(包含id和ip_address字段),替换成自定义字段后,就只会返回我们需要的IP字符串列表啦。

这两种方案都能让你得到期望的JSON格式:

[ { "hostname": "www.example.com", "ip_addresses": [ "1.1.1.1", "2.2.2.2" ] } ]

内容的提问来源于stack exchange,提问作者steelcityamir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:47:40