23

我正在使用 django rest 框架并创建一个简单的序列化程序,如下所示:

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

但是我收到此错误:

KeyError at /cerberus/packages/
'id'

为什么我无法将主键“id”作为序列化数据的一部分?感谢您的帮助!

4

3 回答 3

60

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 (< 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 框架文档

默认隐式生成的 id 字段被标记为 read_only。这会导致它在更新时被删除。

因此,如果您需要id更新方法中的字段,则不能将其声明为只读,而是使用读写字段:

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 回答