Django rest framework 一对一字段更新序列化问题

Django rest framework 一对一字段更新序列化问题,django-rest-framework,Django Rest Framework,######################要求############################# /add\u value/ 有效载荷: { “配置文件id”:“34AB”, “金额”:100.00 } ######################视图集#################################### 类cash_视图集(模型视图集): #######################模型#################################### 模

######################要求#############################

/add\u value/

有效载荷: { “配置文件id”:“34AB”, “金额”:100.00 }

######################视图集####################################

类cash_视图集(模型视图集):

#######################模型####################################

模型-1---

类配置文件(models.Model):

模型-2---

类别现金余额(models.Model):

###############################序列化程序##############################

类SampleSerializer(serializers.ModelSerializer):

#################################问题是######################

假设用户、配置文件和现金余额表中已经有一些数据


根据上面给出的有效载荷,基于概要文件_id,我必须将amt值更新为100,为此,我已在create method(上面给出的create method)中实现了解决方案,请分享您的输入,我希望更新不能在create method中完成,如何根据我的模型设计,通过使用modelviewset来执行更新,以更好的方式改进此功能,您必须重写序列化程序中的更新方法

def update(self, instance, validated_data):
  instance.profile.profile_id 
 = validated_data["profile"].get('profile_id',instance.profile.profile_id)
  instance.amt = validated_data.get('amt', instance.amt) 
  return instance
在您的视图集中

def update(self,request,pk=None):
   profile_id = request.data.get("profile_id")
   profile = Profile.objects.get(profile_id = profile_id)
   ser = self.get_serializer_class()(instance=profile.cash_balance , data = request.data)
   ser.is_valid(raise_exception=True)
   ser.save()
在您的现金余额模型中,传递一个相关的\u名称

profile = models.OneToOneField(Profile, on_delete=models.CASCADE,db_column="profile_id" , related_name="cash_balance")

检查文档:

谢谢您的回复,第一行的错误是-AttributeError:“ForwardOneToOneDescriptor”对象没有属性“profile\u id”,当我检查它显示为modelbase的实例类型时,如果我打印“instance”,它的给出就像我打印一样(instance.profile.profile\u id)-与第一行相同的错误当我使用端点url作为“/add_value/{pk}”时,这种方法很好。我只是想了解,我使用端点作为“/add_value/”的要求以及上面给出的负载,因此我相信这种方法不适合要求,请建议如何通过使用payload以其他方式更新表如果想要这样做,您还需要覆盖视图集中的更新方法。我已经更新了答案。是的,它工作正常,非常感谢您在这方面的帮助。正如在本地计算机中执行的那样,在viewset中,应该出现create方法,而不是update和要返回的响应对象,然后是它的工作完美,还有序列化程序中的instance.save(),然后是它的更新完美,谢谢
profile_id = serializers.CharField(source="profile.profile_id")
remianingAmount = serializers.FloatField(read_only=True)

class Meta:
    model = CashBalance
    fields = ["profile_id", "amt", "remianingAmount"]

def create(self, validated_data):
    profile_dict = validated_data['profile']
    userprofile = Profile.objects.get(profile_id=profile_dict['profile_id'])
    bank_obj = CashBalance.objects.filter(profile_id=userprofile)
    bank_obj.update(amt=validated_data['amt'], remianingAmount=validated_data['amt'])
    return bank_obj[0]

def to_representation(self, instance):
    data = super(serializers.ModelSerializer, self).to_representation(instance)
    print(instance.profile.user.username)
    result = {"profile_id": data['profile_id'], "name": instance.profile.user.username,
              "remianingAmount": data['remianingAmount']}
    return result
def update(self, instance, validated_data):
  instance.profile.profile_id 
 = validated_data["profile"].get('profile_id',instance.profile.profile_id)
  instance.amt = validated_data.get('amt', instance.amt) 
  return instance
def update(self,request,pk=None):
   profile_id = request.data.get("profile_id")
   profile = Profile.objects.get(profile_id = profile_id)
   ser = self.get_serializer_class()(instance=profile.cash_balance , data = request.data)
   ser.is_valid(raise_exception=True)
   ser.save()
profile = models.OneToOneField(Profile, on_delete=models.CASCADE,db_column="profile_id" , related_name="cash_balance")