2013-02-21 4 views
16

Я использую Джанго рамку отдыха и просто создать простой сериалайзер так:идентификатор поля в Джанго рамочного остального сериализаторе

class PackageSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

Однако я получаю эту ошибку

KeyError at /cerberus/packages/ 
'id' 

Каким образом я могу» t получить первичный ключ 'id' как часть моих сериализованных данных? Спасибо за помощь!

ответ

43

HyperlinkedModelSerializer по умолчанию не включает id. В 2.2 и более ранние версии вам необходимо добавить его в явном виде в качестве поля ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 

    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

С 2,3 года, вы можете просто добавить «идентификатор» в опции fields ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

с 3.x года, вы должны использовать ReadOnlyField() вместо Field(), если вы хотите, чтобы добавить его в явном виде, а не использовать опцию fields ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.ReadOnlyField() 

    class Meta: 
     model = Package 
+0

Этот совет помог мне с помощью учебника по rest_framework [link] (http://www.django-rest-framework.org/tutorial/1-serialization#using-modelserializers). В учебнике есть строка 'pk = serializers.Field()', но она должна быть 'id = serializers.Field()'. Я наблюдал за этой опечаткой. – Semo

+2

Теперь должно быть 'id = serializers.ReadOnlyField()' для Django Rest Framework 3.x – rrauenza

+0

Спасибо .. Хорошее объяснение !! –

0

Я просто twea рунец это, чтобы сделать его немного более Сменная создания этого класса:

class HyperlinkedModelSerializerWithId(serializers.HyperlinkedModelSerializer): 
    """Extend the HyperlinkedModelSerializer to add IDs as well for the best of 
    both worlds. 
    """ 
    id = serializers.ReadOnlyField() 

Затем, просто использовать, чтобы сделать ваш сериалайзер и вы находитесь на своем пути.