2013-02-21 8 views
16

Ich verwende django Rest Rahmen und nur eine einfache Serializer wie folgt zu schaffen:ID-Feld in django Rest Rahmen Serializer

class PackageSerializer(serializers.HyperlinkedModelSerializer): 

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

Jedoch habe ich diesen Fehler

KeyError at /cerberus/packages/ 
'id' 

Wie komme ich kann‘ t bekomme ich den Primärschlüssel "id" als Teil meiner serialisierten Daten? Danke fürs Helfen!

Antwort

43

HyperlinkedModelSerializer enthält standardmäßig nicht die id. In 2.2 und früher müssen Sie es explizit als ein Feld hinzufügen ...

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

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

von 2,3 ab, können Sie einfach hinzufügen 'id' zum fields Option ...

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

von 3.x ab, müssen Sie ReadOnlyField() statt Field() verwenden, wenn Sie es explizit hinzufügen möchten, und nicht verwenden, um die fields Option ...

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

    class Meta: 
     model = Package 
+0

Dieser Tipp half mir durch ein Tutorial des rest_framework [link] (http://www.django-rest-framework.org/tutorial/1-serialization#using-modelserializers). Im Tutorial gibt es eine Zeile von 'pk = serializers.Field()', aber es sollte 'id = serializers.Field()' sein. Ich habe diesen Tippfehler übersehen. – Semo

+2

Es sollte jetzt 'id = serializers.ReadOnlyField()' für Django Rest Framework 3.x sein – rrauenza

+0

Danke..Gute Erklärung !! –

0

ich nur TWEA ked dies durch die Schaffung dieser Klasse es ein wenig mehr steckbar zu machen:

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

Dann nur, dass Ihr Serializer zu machen verwenden und Sie sind auf dem Weg.