поле id в django rest framework serializer

Я использую django rest framework и просто создаю простой сериализатор следующим образом:

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

Однако я получаю эту ошибку

KeyError at /cerberus/packages/
'id'

Почему я не могу получить первичный ключ "id" как часть моих сериализованных данных? Спасибо за помощь!

Ответ 1

HyperlinkedModelSerializer не включает id по умолчанию. В 2.2 и ранее вам нужно будет добавить его явно как поле...

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

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

Начиная с версии 2.3, вы можете просто добавить "id" в опцию fields...

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

Начиная с 3.x, вы должны использовать ReadOnlyField() вместо Field() если вы хотите добавить его явно и не использовать опцию fields...

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

    class Meta:
        model = Package

Ответ 2

Я просто переделал это, чтобы сделать его более гибким, создав этот класс:

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

Тогда просто используйте это, чтобы сделать свой сериализатор, и вы уже в пути.