Django Rest Framework更新操作未保存修改问题求助
问题分析与解决方案:OneToOne关联Model的PUT更新失效问题
你的问题根源完全在HotelSerializer的update方法里——你现在的写法根本没处理前端传入的更新数据,只是把原有的Company和Hotel数据重新保存了一遍,自然看不到任何修改效果。
先拆解你当前update方法的问题:
- 没有从
validated_data中取出更新后的公司数据,反而直接复用instance.company的原有字段值创建对象,save操作等于白做 - 完全没更新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
相关产品推荐
相关产品推荐

