这似乎是由于包含唯一约束的嵌套序列化程序模型导致的验证错误,请参阅
post
. 根据文章,DRF没有处理这种情况,因为很难意识到序列化程序是否是另一个序列化程序中的嵌套序列化程序。这就是为什么
create()
和
update()
在调用它们之前,从没有进行过验证。
解决这个问题的方法是在
GroupSerializer
具体如下:
class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = Group
fields = ['id', 'name']
extra_kwargs = {
'name': {'validators': []},
}
顺便说一句,在你的
更新()
和
创建()
代码。首先,你没有
instance.save()
所以在整个过程完成后,实例不会被更新。其次是
groups
只是一个字典列表,不应该这样添加对象。以下是基于操作代码的修改:
def update(self, instance, validated_data):
data = validated_data.copy()
groups = data.pop('groups', [])
for key, val in data.items():
setattr(instance, key, val)
instance.save() # This will indeed update DB values
group_ids = [g['id'] for g in groups]
instance.groups.clear()
instance.groups.add(*group_ids) # Add all groups once. Also you can replace these two lines with
# instance.groups.set(*group_ids)
return instance