2

django & django-rest-framework を使用して、次のモデルがあります (これは単純化されていますが、すべてそこにあります)。

class Device(Model):
    #stuff

class DeviceInformation(Model):
    device = ForeignKey(Device, reverse='infos')
    key = CharField(max_length=32)
    value = CharField(max_length=1024)

django-rest-framework の ModelSerializer を介してデバイスをシリアル化すると、次のような結果が得られます。

{
    //stuff
    infos: [{
        'key':'BatteryLevel',
        'value':'80%'
    },{
        'key':'DeviceName',
        'value':'my device'
    }, //etc
    ]
}

これは完全に正常です。ただし、次のようにシリアル化する方がはるかに理にかなっています。

{
    //stuff
    infos: {
        'BatteryLevel':'80%',
        'DeviceName':'my device',
        //etc
    }
}

それ、どうやったら出来るの?それは可能ですか?これらの情報のいずれも逆シリアル化する必要がないことに注意してください。

編集:私のシリアライザーは次のとおりです:

class DeviceInfoSerializer(ModelSerializer):
    class Meta:
        model = DeviceInformation
        fields = ('key', 'value')
        read_only_fields = fields


class DeviceSerializer(HyperlinkedModelSerializer):

    udid = serializers.CharField(read_only=True)

    def __init__(self, *args, **kwargs):
        super(DeviceSerializer, self).__init__(*args, **kwargs)
        if hasattr(self, 'object') and self.object and not self.many:
            self.data['infos'] = DeviceInfoSerializer(
                self.object.infos.all(), many=True).data

    class Meta:
        model = Device
        fields = ['udid', 'model', 'tracked']
        read_only_fields = ('model', 'tracked')
        slug_field = 'udid'
4

1 に答える 1

0

読み取り専用の場合、最善の方法は を使用することSerializerMethodFieldです。

これはあなたを変え、あなたDeviceSerializerの必要性を取り除きますDeviceInfoSerializer.

class DeviceSerializer(HyperlinkedModelSerializer):
    udid = serializers.CharField(read_only=True)
    infos = serializers.SerializerMethodField('get_infos')

    def get_infos(self, obj):
        return {
            info.key: info.value
            for info in obj.infos.all()
        }

    class Meta:
        model = Device
        fields = ['udid', 'model', 'tracked', 'infos']
        read_only_fields = ('model', 'tracked', 'infos')
        slug_field = 'udid'
于 2014-03-13T08:25:23.230 に答える