You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:55:21