Django多对多字段赋值报错:禁止直接反向赋值,请使用set()
Django多对多反向字段赋值报错解决
错误原因
你代码中instance.category = validated_data.get('category', instance.category)这行是直接给多对多关系的反向字段赋值,Django明确禁止这种操作,无论正向还是反向关联的多对多字段,都不能直接用=赋值,必须通过集合方法更新。
解决方案
- 删除直接赋值多对多字段的代码
- 改用
set()方法批量更新多对多集合,同时处理validated_data中可能不存在该字段的情况(保留原数据)
修改后的完整代码:
def update(self, instance, validated_data): # 先取出多对多字段的数据,避免和普通字段处理冲突 category_data = validated_data.pop('category', None) parent_category_data = validated_data.pop('parent_category', None) # 批量更新普通字段 for field, value in validated_data.items(): setattr(instance, field, value) # 更新category多对多字段 if category_data is not None: instance.category.set(category_data) # 更新parent_category多对多字段 if parent_category_data is not None: instance.parent_category.set(parent_category_data) instance.save() return instance
补充说明
- 若想用
add()方法,需确保传入单个对象或可迭代对象集合(比如列表),写法为instance.category.add(*category_data)(适用于在原有集合基础上追加数据);而set()会先清空原有集合再添加新数据,更适合全量替换场景。 - 多对多字段的
set()/add()操作无需提前保存实例,方法会直接操作中间关联表。
内容的提问来源于stack exchange,提问作者Saman Ahmadi
相关产品推荐
相关产品推荐

