2013-02-21 9 views
16

私はジャンゴ残りのフレームワークを使用して、ちょうどこのような単純なシリアライザ作成しています:私はこのエラーを取得するしかしidフィールド

​​

KeyError at /cerberus/packages/ 
'id' 

私ができる来るどのように」シリアル化されたデータの一部としてプライマリキー '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オプションに「ID」を追加することができます...

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

以降3.xのからあなたがfieldsオプションを使用して明示的に追加しないようにしたい場合は、あなたがReadOnlyField()代わりのField()を使用する必要があります...

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

これで、Django Rest Framework 3.xの 'id = serializers.ReadOnlyField()'になるはずです – 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() 

はその後、ちょうどあなたのシリアライザを作るためにそれを使用して、あなたはあなたの方法にしています。

関連する問題