Django rest framework 一对一字段更新序列化问题
######################要求############################# /add\u value/ 有效载荷: { “配置文件id”:“34AB”, “金额”:100.00 } ######################视图集#################################### 类cash_视图集(模型视图集): #######################模型#################################### 模型-1--- 类配置文件(models.Model): 模型-2--- 类别现金余额(models.Model): ###############################序列化程序############################## 类SampleSerializer(serializers.ModelSerializer): #################################问题是###################### 假设用户、配置文件和现金余额表中已经有一些数据Django rest framework 一对一字段更新序列化问题,django-rest-framework,Django Rest Framework,######################要求############################# /add\u value/ 有效载荷: { “配置文件id”:“34AB”, “金额”:100.00 } ######################视图集#################################### 类cash_视图集(模型视图集): #######################模型#################################### 模
根据上面给出的有效载荷,基于概要文件_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")