我在view.py中使用Django Rest Framework对perform_update事件使用.save(field =' value')时遇到了一些奇怪的行为。我正在更新特定字段,添加逻辑并向序列化程序添加其他数据,然后根据客户的响应/ api调用将数据保存在模型/数据库中。
每次我通过将PUT(更新)设置为'是'进行测试然后' no',.save()随机工作。我认为有时save()在变量设置并传递给.save()之前发生。我是Django和Python的新手,所以我可能没有正确地做到这一点。
我也试过声明变量,然后将这些变量传递给.save(field ='创建变量')但我仍然得到同样的奇怪行为。
这是我的代码:
def perform_update(self, serializer):
# Change depending on customer's repsonse.
# customer_acceptance is "yes" or "no" from front end
print(serializer.instance.customer_acceptance)
if serializer.instance.customer_acceptance == 'yes':
serializer.instance.creditor_status = 'accepted'
serializer.instance.agreement_acceptance = 'yes'
if serializer.instance.customer_acceptance == 'no':
serializer.instance.creditor_status = 'customer_rejected'
serializer.instance.agreement_acceptance = 'no'
if serializer.is_valid():
print(serializer.instance.creditor_status)
serializer.save(
customer_response_date = datetime.datetime.now()
)
答案 0 :(得分:0)
使用它:
def perform_update(self, serializer):
obj = serializer.instance
obj.agreement_acceptance = obj.customer_acceptance
if obj.customer_acceptance == 'yes':
obj.creditor_status = 'accepted'
else
obj.creditor_status = 'customer_rejected'
serializer.save(customer_response_date = datetime.datetime.now())
不需要调用is_valid。它已被召唤。
答案 1 :(得分:0)
好的,我想我已经解决了。
serializer.instance =因为数据模型现在在保存之前,所以它总是在保存之前检索数据(而不是从PUT请求中的数据)。这就是为什么每次我保存时都有奇怪的行为然后不行,它会等待下一个api调用来输入正确的答案。
我现在正在使用validated_data [" customer_acceptance"] ==' yes'在serializer.py中如下所示,它工作得很好。因为它基于实际的PUT调用请求数据,而不是它当前在实例/模型中的数据:
def update(self, instance, validated_data):
# print(validated_data.get('customer_acceptance', instance.customer_acceptance))
# print(validated_data["customer_acceptance"])
# print(validated_data.get('customer_acceptance'))
if validated_data["customer_acceptance"] == 'yes':
instance.creditor_status = 'accepted'
instance.agreement_acceptance = 'yes'
if validated_data["customer_acceptance"] == 'no':
instance.creditor_status = 'customer_rejected'
instance.agreement_acceptance = 'no'
instance.customer_acceptance = validated_data.get('customer_acceptance', instance.customer_acceptance)
instance.customer_response_date = datetime.datetime.now()
instance.save()
return instance
我不确定这三件事之间有什么不同,但他们似乎得出了同样的答案:
print(validated_data.get('customer_acceptance', instance.customer_acceptance))
print(validated_data["customer_acceptance"])
print(validated_data.get('customer_acceptance'))