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
相关产品推荐
相关产品推荐

