我正在使用django rest框架,只是创建一个这样的简单序列化器:
class PackageSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Package
fields = ('id', 'url', 'title','location')
但是我收到了这个错误:
KeyError at /cerberus/packages/
'id'
为什么我不能将主键'id'作为序列化数据的一部分?谢谢你的帮助!
答案 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()