如何自定义Django Rest Framework序列化器输出? [英] How can one customize Django Rest Framework serializers output?

查看:145
本文介绍了如何自定义Django Rest Framework序列化器输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像Django这样的模型:

  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 :[
{
地址: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
}
]

如何实现?

解决方案

创建自定义序列化程序字段并实现 to_native ,以便它返回您想要的列表。



如果您使用 source =*技术,那么这样的事情可能会起作用:

  class CustomField(Field):
def to_native(self,obj):
return obj.macAddresses.all()
pre>

我希望有所帮助。


I have a Django model that is like this:

class WindowsMacAddress(models.Model):
    address = models.TextField(unique=True)
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')

And two serializers, defined as:

class WindowsFlatMacAddressSerializer(serializers.Serializer):
    address = serializers.Field()

class WindowsCompleteMappingSerializer(serializers.Serializer):
    id = serializers.Field()
    macAddresses = WindowsFlatMacAddressSerializer(many=True)
    clientId = serializers.Field()

When accessing the serializer over a view, I get the following output:

[
    {
        "id": 1, 
        "macAddresses": [
            {
                "address": "aa:aa:aa:aa:aa:aa"
            }, 
            {
                "address": "bb:bb:bb:bb:bb:bb"
            }
        ], 
        "clientId": null
    }
]

Almost good, except that I'd prefer to have:

[
    {
        "id": 1, 
        "macAddresses": [
            "aa:aa:aa:aa:aa:aa",
            "bb:bb:bb:bb:bb:bb"
        ],
        "clientId": null
    }
]

How can I achieve that ?

解决方案

Create a custom serializer field and implement to_native so that it returns the list you want.

If you use the source="*" technique then something like this might work:

class CustomField(Field):
    def to_native(self, obj):
        return obj.macAddresses.all()

I hope that helps.

这篇关于如何自定义Django Rest Framework序列化器输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆