2017-04-23 48 views
0

我在view.py中使用Django Rest Framework的perform_update事件上使用.save(field ='value')时出现了一些奇怪的行为。我正在更新一个特定的字段,添加逻辑并向串行器添加额外的数据,然后根据客户的响应/ api调用将数据保存到模型/数据库中。Djano Rest框架 - 更新时保存额外数据

每次我通过设置PUT(更新)为'yes'然后'no'来测试时,.save()随机地工作。我想有时候save()发生在变量被设置并传递给.save()之前。我对Django和Python相当陌生,所以我可能没有正确地做到这一点。我也尝试声明变量,然后将这些变量传递到.save(field ='created variable'),但我仍然得到相同的奇怪行为。

这里是我的代码:

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

好的,我想我已经完成了。

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')) 
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。它已被调用。

相关问题