2013-05-28 2 views
2

에 사전도 같은 개체의 목록을 직렬화, 내가 가진 다음과 같은 모델 (이 단순화되어 있지만, 모든이의) :장고에게 & 장고 - 나머지 프레임 워크를 사용 DjangoRestFramework

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

어느 것이 정상입니까? 그러나 다음과 같이 serialize하는 것이 더 합리적입니다.

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

어떻게하면됩니까? 심지어 가능할까요? 이러한 정보를 deserialize 할 필요는 없습니다.

편집 : 당신의 읽기 전용의 경우를 들어

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' 
+0

전문가가 아닌 경우 get_field (..) 또는 get_key_field() 및 get_value_field()를 재정의하면 어떻게됩니까? http://django-rest-framework.org/api-guide/serializers.html#customising-the-default-fields – EsseTi

+0

소스를 검사 한 후에는 작동하지 않습니다. 그러나, 커스텀'Field'를 프린트하고 to_native (...)를 겹쳐 쓰면 이것을 달성 할 수 있어야합니다. 그러나 나는 이것을 매우 해킹하는 것처럼 느낀다. – Habfast

+0

당신의 serializers는 어떻게 생겼습니까? – Jeff

답변

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' 
관련 문제