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

Django Rest Framework更新操作未保存修改问题求助

问题分析与解决方案:OneToOne关联Model的PUT更新失效问题

你的问题根源完全在HotelSerializer的update方法里——你现在的写法根本没处理前端传入的更新数据,只是把原有的Company和Hotel数据重新保存了一遍,自然看不到任何修改效果。

先拆解你当前update方法的问题:

  1. 没有从validated_data中取出更新后的公司数据,反而直接复用instance.company的原有字段值创建对象,save操作等于白做
  2. 完全没更新Hotel实例的任何字段,直接调用instance.save(),没有任何实际修改

下面是修正后的Serializer代码,我会同步说明关键逻辑:

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Company
        fields = ('id', 'name', 'legal_name', 'url', 'address')

class HotelSerializer(serializers.HyperlinkedModelSerializer):
    company = CompanySerializer()

    class Meta:
        model = models.Hotel
        fields = ('company', 'code', 'city', 'category', 'capacity', 'position', 'in_pickup')

    def create(self, validated_data):
        company_data = validated_data.pop('company')
        new_company = models.Company.objects.create(**company_data)
        hotel = models.Hotel.objects.create(company=new_company, **validated_data)
        return hotel

    def update(self, instance, validated_data):
        # 1. 处理关联Company的更新
        company_data = validated_data.pop('company', None)
        if company_data:
            # 用已关联的Company实例来更新,而非新建
            company_serializer = CompanySerializer(instance.company, data=company_data)
            if company_serializer.is_valid(raise_exception=True):
                company_serializer.save()
        
        # 2. 处理Hotel自身字段的更新
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        instance.save()
        
        return instance

关键修改点说明:

  • Company更新逻辑:从validated_data中取出前端传入的公司更新数据,复用已关联的instance.company实例,通过CompanySerializer的标准更新流程修改数据库记录,这才是真正的更新操作
  • Hotel更新逻辑:遍历validated_data中剩余的Hotel字段,逐个赋值给实例再保存,确保前端传入的修改能同步到数据库
  • 异常调试:添加raise_exception=True,如果Company的数据验证失败会直接抛出错误,方便你快速定位问题

这个写法同时兼容PUT(全量更新)和PATCH(部分更新)请求,未传入的字段会保留原有值。

内容的提问来源于stack exchange,提问作者HuLu ViCa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:17:29