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

时间:2013-02-21 23:56:19

标签: django django-rest-framework

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

class PackageSerializer(serializers.HyperlinkedModelSerializer):

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

但是我收到了这个错误:

KeyError at /cerberus/packages/
'id'

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

3 个答案:

答案 0 :(得分:52)

默认情况下,

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

答案 1 :(得分:3)

我只是通过创建这个类来调整它以使其更加可插拔:

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

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

答案 2 :(得分:1)

根据Django docs

  

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

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

class PackageSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()