在Django Rest Framework中将对象列表序列化为字典

时间:2013-05-28 14:24:56

标签: django json serialization django-rest-framework

使用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'

1 个答案:

答案 0 :(得分: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'