2013-08-02 41 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

謝謝!這對我以後會很有用。 –

相關問題