2013-08-02 101 views
7

我有一个Django模型是这样的:如何自定义Django Rest Framework序列化器的输出?

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 
    } 
] 

我该如何做到这一点?

回答

11

创建一个custom serializer field并执行to_native,以便它返回您想要的列表。

如果使用source="*" technique那么这样的事情可能工作:

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

我希望帮助。

+0

所有链接已打破,请你更新它 – vimal1083

+0

你走了。 –

6

卡尔顿的答案将工作做得很好。还有一些你可以采取的其他方法。

您也可以使用SlugRelatedField来表示关系,使用目标上的给定字段。

因此,例如...

class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = serializers.SlugRelatedField(slug_field='address', many=True, read_only=True) 
    clientId = serializers.Field() 

或者,如果WindowsMacAddress__str__只显示地址,那么你可以简单地使用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() 

以通过documentation on serializer fields一看让你可以代表你的API中关系的各种方式更好的主意。

+0

嗯我认为'RelatedField'和'SlugRelatedField'只能与'ModelSerializer'一起使用? –

+0

所有关系字段都与Django模型关系一起使用。他们可以在Serializer或ModelSerializer类中使用。 –

+0

谢谢!这对我以后会很有用。 –

相关问题