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 回答