Djano Rest Framework - 保存更新时的额外数据

时间:2017-04-23 13:14:18

标签: django django-rest-framework

我在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()
        )

2 个答案:

答案 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'))