9

次のような Django モデルがあります。

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

どうすればそれを達成できますか?

4

2 に答える 2

15

カスタムシリアライザーフィールドを作成して実装to_nativeし、必要なリストを返すようにします。

source="*"この手法を使用すると、次のようなものが機能する可能性があります。

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

それが役立つことを願っています。

djangorestframework>=3.9.1 の更新

documentationによると、メソッドto_representation()とメソッドのいずれかまたは両方をオーバーライドする必要がありますto_internal_value()。例

class CustomField(Field):
    def to_representation(self, value)
        return {'id': value.id, 'name': value.name}
于 2013-08-02T09:33:12.403 に答える
7

カールトンの答えはうまくいくでしょう。他にもいくつかの方法があります。

SlugRelatedFieldターゲットの特定のフィールドを使用して、リレーションシップを表す を使用することもできます。

だから例えば…

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

または、 の が単に住所を表示する場合は__str__WindowsMacAddress単純に を使用できます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 で関係を表現するさまざまな方法について理解を深めるために、シリアライザーフィールドに関するドキュメントを参照してください。

于 2013-08-02T09:46:59.407 に答える