web-dev-qa-db-fra.com

champ id dans le sérialiseur d'infrastructure de repos Django

J'utilise un framework de repos Django et je viens de créer un sérialiseur simple comme celui-ci:

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

Cependant, j'obtiens cette erreur:

KeyError at /cerberus/packages/
'id'

Comment se fait-il que je ne puisse pas obtenir l'identifiant de clé primaire dans mes données sérialisées? Merci pour ton aide!

19
Hieu Phan

HyperlinkedModelSerializer n'inclut pas la id par défaut. Dans les versions 2.2 et antérieures, vous devrez l'ajouter explicitement en tant que champ ...

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

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

À partir de la version 2.3, vous pouvez simplement ajouter "id" à l'option fields ...

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

À partir de la version 3.x, vous devez utiliser ReadOnlyField() au lieu de Field() si vous souhaitez l'ajouter explicitement et ne pas utiliser l'option fields ...

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

    class Meta:
        model = Package
50
Tom Christie

J'ai juste modifié cela pour le rendre un peu plus connectable en créant cette classe:

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

Ensuite, utilisez-le pour créer votre sérialiseur et vous êtes prêt.

1
mlissner