Django中PUT请求调用.save()无法更新外键字段问题
问题原因及解决办法
你的问题核心是自定义的update方法仅保存了ChatUser实例,未保存修改后的Identification关联对象。你修改了instance.identification的字段值,但这些改动只停留在内存中,没有同步到数据库——因为你只调用了instance.save()(保存ChatUser),却没调用instance.identification.save()(保存关联的Identification)。
修改后的序列化器代码
class IdentificationInputSerializer(serializers.ModelSerializer): class Meta: model = Identification fields = "__all__" read_only_fields = ["id"] class ChatUserInputSerializer(serializers.ModelSerializer): identification = IdentificationInputSerializer() class Meta: model = ChatUser fields = ["id", "userId", "identification"] read_only_fields = ["id", "userId"] def update(self, instance, validated_data): identification_data = validated_data.pop('identification') identification_instance = instance.identification # 批量更新字段,替代逐个赋值的冗余写法 for attr, value in identification_data.items(): setattr(identification_instance, attr, value) # 必须单独保存关联的Identification实例 identification_instance.save() # 若ChatUser自身字段无修改,此句可省略;有修改则保留 instance.save() return instance
关键说明
- 操作外键关联对象的字段时,必须单独调用该关联对象的
save()方法,否则修改不会写入数据库。 - 用
setattr循环赋值能简化代码,避免重复的字段判断与赋值,提升代码可维护性。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

