23

私はdjangorestフレームワークを使用していて、次のような単純なシリアライザーを作成しています。

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

ただし、次のエラーが発生します。

KeyError at /cerberus/packages/
'id'

シリアル化されたデータの一部として主キー「id」を取得できないのはなぜですか?助けてくれてありがとう!

4

3 に答える 3

60

HyperlinkedModelSerializeridデフォルトでは含まれていません。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(<3.3)以降、明示的に追加し、オプションを使用しない場合は、ReadOnlyField()代わりにを使用する必要があります...Field()fields

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

    class Meta:
        model = Package
于 2013-02-22T08:59:32.850 に答える
12

Django Rest Frameworkのドキュメントによると:

デフォルトの暗黙的に生成されたidフィールドは、read_onlyとしてマークされています。これにより、更新時に削除されます。

したがって、idupdateメソッドでフィールドが必要な場合は、読み取り専用として宣言するのではなく、代わりに読み取り/書き込みフィールドを使用する必要があります。

class PackageSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
于 2019-12-08T22:27:13.497 に答える
4

このクラスを作成して、これを少し調整してプラグインしやすくしました。

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

次に、それを使用してシリアライザーを作成します。

于 2018-01-31T21:51:08.407 に答える