Django Rest Framework中ManyToMany字段update方法自定义问题求助
问题原因
你编写的update方法存在2个核心逻辑错误:
- 完全遗漏了普通字段的更新逻辑:你仅提取了多对多字段
users处理关联关系,validated_data中剩下的title、description等普通字段没有被更新到实例上,导致除了用户关联之外的字段修改全部不生效。 - 不合理的默认值设置:请求未携带
users字段时你默认赋值为空列表调用set()方法,会直接清空该实例所有已关联的用户,不符合常规接口的更新逻辑。
你提到的实例被删除大概率是额外逻辑导致的,比如模型配置了关联级联删除、请求URL误写调用了DELETE接口等,可先修复序列化器逻辑后再排查。
修复后的代码
class FolderSerializer(serializers.ModelSerializer): documents = DocumentSerializer(many=True, read_only=True) class Meta: model = Folder fields = '__all__' def update(self, instance, validated_data): # 仅当请求携带users字段时才提取处理,否则跳过关联更新 users = validated_data.pop('users') if 'users' in validated_data else None # 调用父类更新逻辑处理所有普通字段,父类已内置save操作不需要额外重复调用 instance = super().update(instance, validated_data) if users is not None: instance.users.set(users) return instance
补充注意事项
- PUT为全量更新请求,需要携带模型定义的所有必填字段,否则序列化器会校验失败;如果只需要更新部分字段,建议使用PATCH请求,调用序列化器时传入
partial=True参数即可。 set()方法为全量替换关联关系,如果业务需要追加关联而不是覆盖原有关联,可以替换为instance.users.add(*users)方法。
内容的提问来源于stack exchange,提问作者Giulia
相关产品推荐
相关产品推荐

