2013-02-21 38 views
16

sto usando django quadro riposo e solo la creazione di un semplice serializzatore come questo:campo id nel serializzatore Django quadro resto

class PackageSerializer(serializers.HyperlinkedModelSerializer): 

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

Tuttavia ottengo questo errore

KeyError at /cerberus/packages/ 
'id' 

Come mai posso' t ottenere la chiave primaria 'id' come parte dei miei dati serializzati? Grazie dell'aiuto!

risposta

43

HyperlinkedModelSerializer non include id per impostazione predefinita. In 2.2 e versioni precedenti è necessario aggiungere esplicitamente come un campo ...

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

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

da 2,3 in poi, si può semplicemente aggiungere 'id' per l'opzione fields ...

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

da 3.x in poi, è necessario utilizzare ReadOnlyField() invece di Field() se si desidera aggiungere esplicitamente e non utilizzare l'opzione fields ...

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

    class Meta: 
     model = Package 
+0

Questo suggerimento mi ha aiutato attraverso un Tutorial del rest_framework [collegamento] (http://www.django-rest-framework.org/tutorial/1-serialization#using-modelserializers). Nel tutorial c'è una riga di 'pk = serializers.Field()', ma dovrebbe essere 'id = serializers.Field()'. Ho supervisionato quel refuso. – Semo

+2

Dovrebbe essere ora 'id = serializers.ReadOnlyField()' per Django Rest Framework 3.x – rrauenza

+0

Grazie ... Buona spiegazione !! –

0

ho appena twea ked questo per renderlo un po 'più di innesto con la creazione di questa classe:

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

Poi, basta usare che per rendere il vostro serializzatore e siete sulla buona strada.

Problemi correlati