ti-enxame.com

campo de ID não serializador de estrutura de descanso do Django

Estou usando o framework de descanso do Django e apenas criando um serializador simples como este:

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

No entanto, recebo este erro:

KeyError at /cerberus/packages/
'id'

Por que não consigo obter a chave primária 'id' como parte dos meus dados serializados? Obrigado por ajudar!

19
Hieu Phan

HyperlinkedModelSerializer não inclui a id por padrão. No 2.2 e anteriores, você precisará adicioná-lo explicitamente como um campo ...

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

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

De 2.3 em diante, você pode simplesmente adicionar 'id' à opção fields ...

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

De 3.x em diante, você deve usar ReadOnlyField() em vez de Field() se quiser adicioná-lo explicitamente e não usar a opção fields ...

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

    class Meta:
        model = Package
50
Tom Christie

Eu apenas ajustei isso para torná-lo um pouco mais plugável, criando esta classe:

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

Então, basta usar isso para fazer seu serializador e você está no seu caminho.

1
mlissner