2013-08-02 7 views
7

私はこのようなものですDjangoのモデルがあります:Django Rest Frameworkシリアライザの出力をカスタマイズするにはどうすればよいですか?

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

そして2のように定義シリアライザ、:

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() 

あなたのAPIに関係を表現することができるさまざまな方法のより良いアイデアを得るためにdocumentation on serializer fieldsを通して見てみましょう。

+0

「RelatedField」と「SlugRelatedField」は、「ModelSerializer」でしか動作しないと思いましたか? –

+0

すべてのリレーショナルフィールドはDjangoのモデル関係で動作します。彼らは 'Serializer'か' ModelSerializer'クラスのどちらかでうまく動作します。 –

+0

ありがとう!それは後で私にとって役に立ちます。 –