django rest框架序列化器中的id字段

Hie*_*han 20 django django-rest-framework

我正在使用django rest框架,只是创建一个这样的简单序列化器:

class PackageSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Package
        fields = ('id', 'url', 'title','location')
Run Code Online (Sandbox Code Playgroud)

但是我收到此错误:

KeyError at /cerberus/packages/
'id'
Run Code Online (Sandbox Code Playgroud)

为什么我不能将主键'id'作为序列化数据的一部分?谢谢你的帮助!

Tom*_*tie 54

HyperlinkedModelSerializerid默认情况下不包括.在2.2及更早版本中,您需要将其明确添加为字段...

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

    class Meta:
        model = Package
        fields = ('id', 'url', 'title','location')
Run Code Online (Sandbox Code Playgroud)

从2.3开始,您只需在fields选项中添加"id"即可...

class PackageSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Package
        fields = ('id', 'url', 'title','location')
Run Code Online (Sandbox Code Playgroud)

从3.x开始,您必须使用ReadOnlyField()而不是Field()如果您想明确添加它而不使用fields选项...

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

    class Meta:
        model = Package
Run Code Online (Sandbox Code Playgroud)

  • 它现在应该是Django Rest Framework 3.x的`id = serializers.ReadOnlyField()` (3认同)
  • 自 **3.3.0** 版本起,不推荐使用不带 'fields' 属性或 'exclude' 属性的 ModelSerializer。因此,第三个代码示例将因 `AssertionError` 而失败。 (2认同)

rom*_*mor 12

根据Django Rest Framework 文档

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

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

class PackageSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
Run Code Online (Sandbox Code Playgroud)


mli*_*ner 5

我只是通过创建此类对其进行了调整,使其更具可插入性:

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

然后,只需使用它来制作序列化器即可。