Python 如何定制Django Rest框架序列化程序的输出?
我有一个Django模型是这样的:Python 如何定制Django Rest框架序列化程序的输出?,python,django,json,django-rest-framework,Python,Django,Json,Django Rest Framework,我有一个Django模型是这样的: class WindowsMacAddress(models.Model): address = models.TextField(unique=True) mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 和两个序列化程序,定义为: class WindowsFlatMacAddressSerializer(serialize
class WindowsMacAddress(models.Model):
address = models.TextField(unique=True)
mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')
和两个序列化程序,定义为:
class WindowsFlatMacAddressSerializer(serializers.Serializer):
address = serializers.Field()
class WindowsCompleteMappingSerializer(serializers.Serializer):
id = serializers.Field()
macAddresses = WindowsFlatMacAddressSerializer(many=True)
clientId = serializers.Field()
通过视图访问序列化程序时,我得到以下输出:
[
{
"id": 1,
"macAddresses": [
{
"address": "aa:aa:aa:aa:aa:aa"
},
{
"address": "bb:bb:bb:bb:bb:bb"
}
],
"clientId": null
}
]
差不多不错,不过我更喜欢:
[
{
"id": 1,
"macAddresses": [
"aa:aa:aa:aa:aa:aa",
"bb:bb:bb:bb:bb:bb"
],
"clientId": null
}
]
如何实现这一点?创建一个并将其实现为\u native
,以便它返回您想要的列表
如果您使用,那么类似的方法可能会起作用:
class CustomField(Field):
def to_native(self, obj):
return obj.macAddresses.all()
我希望这有帮助
djangorestframework>=3.9.1的更新
根据,现在需要重写to_representation()
和to_internal_value()
方法中的一个或两个。范例
class CustomField(Field):
def to_representation(self, value)
return {'id': value.id, 'name': value.name}
卡尔顿的回答会起作用的。你还可以采取其他几种方法 您还可以使用目标上的给定字段使用表示关系的
SlugRelatedField
比如说
class WindowsCompleteMappingSerializer(serializers.Serializer):
id = serializers.Field()
macAddresses = serializers.SlugRelatedField(slug_field='address', many=True, read_only=True)
clientId = serializers.Field()
或者,如果WindowsMacAddress
的\uuuu str\uuuu
仅显示地址,则您可以简单地使用RelatedField
,这是一个基本的只读字段,将为您提供关系目标的简单字符串表示
# models.py
class WindowsMacAddress(models.Model):
address = models.TextField(unique=True)
mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')
def __str__(self):
return self.address
# serializers.py
class WindowsCompleteMappingSerializer(serializers.Serializer):
id = serializers.Field()
macAddresses = serializers.RelatedField(many=True)
clientId = serializers.Field()
浏览一下,以更好地了解可以在API中表示关系的各种方法。Hmm我认为
RelatedField
和SlugRelatedField
仅适用于ModelSerializer
?所有关系字段都适用于Django模型关系。无论是用于序列化程序
还是模型序列化程序
类,它们都可以正常工作。谢谢!这对我以后会很有用。所有的链接都断了,你能更新一下吗