python - update() 抛出 TypeError : serializer. update() 得到意外的关键字参数 'data'

标签 python django python-3.x django-rest-framework

我正在尝试在已成功发送消息后更新已数据库保存的对象。它调用序列化器类的 update() 方法来实现此目的。这是将更新其实例的模型:

class SMSMessages(models.Model):
    sms_number_to = models.CharField(max_length=14)
    sms_content = models.CharField(max_length=160)
    sending_user = models.ForeignKey("SMSUser", on_delete=models.PROTECT, related_name="user_that_sent")
    sent_date = models.DateTimeField(auto_now=True)
    delivery_status = models.BooleanField(default=False)

    class Meta:
        verbose_name_plural = "SMSMessages"

    def __str__(self):
        return str(self.sending_user)

这是我正在使用的序列化器类:

class SMSMessagesSerializer(serializers.ModelSerializer):
    """
    A class for serializing the SMSMessages model's data. It sub-classes the
    ModelSerializer class from serializer's module.
    """

    class Meta:
        model = SMSMessages
        fields = '__all__'

        def update(self, instance, validated_data):
            """
            This method is used to update an instance of the SMSMessages's delivery_status attribute.
            It get's the value for delivery_status from the input parameter, updates the specific instance
            of the SMSMessagesSerializer, saves that instance and returns it.
            """
            instance = self.get_object()
            instance.delivery_status = validated_data.get('delivery_status', instance.delivery_status)
            instance.save()
            return instance

这是具有 POST 方法的 APIView 类,如果消息发送成功,该方法将更新:

class SMSView(APIView):
    """
    This class is responsible for all the method operations of an sms. It provides implementations for the GET, POST, and OPTIONS methods.
    Each method provides it's own description.
    """

    serializer_class = SMSMessagesSerializer

    def get(self, request):
        """
        This method is used to GET all created instance of the SMSMessages class that are saved in the db.
        """
        queryset = SMSMessages.objects.filter(sending_user=request.user)
        while queryset:
            return Response(
                data={
                    queryset.values()
                    },
                status=status.HTTP_200_OK,
                content_type="application/json"
            )
        else:
            return Response(
                data={
                    "no sms has been sent"
                },
                status=status.HTTP_404_NOT_FOUND,
                content_type="application/json"
            )

    def post(self, request):
        """
        This method is used to create an instance of the SMSMessages indirectly by using the SMSMessagesSerializer.
        If that is valid it will be passed to the sender() method from the notification.sender module. The serializer
        will be saved, aka the object will be saved to the database, and then the sender() is called. It will run three
        times before it gives up and fails. Once that returns a True value the instance will be called, aka the object
        will be saved to the database, with a delivery_status value of True.
        """
        sms_messages_serializer = SMSMessagesSerializer(
            data={
                "sms_number_to": request.data.get("sms_number_to"),
                "sms_content": request.data.get("sms_content"),
                "sending_user": request.data.get("sending_user")
            }
        )
        permission_classes = (permissions.IsAuthenticated)

        if sms_messages_serializer.is_valid():
            data_to_send = {
                "number": sms_messages_serializer.validated_data[
                    "sms_number_to"
                ],
                "msg_text": sms_messages_serializer.validated_data[
                    "sms_content"
                ]
            }
            sms_messages_serializer.save()

        # TODO refactor this into it's own function
        max_retry = 0
        resp = Response()
        while max_retry < 3:
            max_retry += 1
            status_flag, status_response = sender(data_to_send)
            if not status_flag:
                resp = Response(
                    data={
                        "error": f"{status_response.text}"
                    },
                    status=status_response.status_code,
                    content_type="application/json"
                )
            else:
                sms_messages_serializer.update(
                    data={
                        "delivery_status": True
                    },
                    partial=True
                )
                resp = Response(
                    data={
                        "success": f"{status_response.json()}"
                    },
                    headers=status_response.headers,
                    status=status_response.status_code,
                    content_type="application/json"
                )
                return resp
        else:
            resp = Response(
                data={
                    "error": "unable to send sms"
                },
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                content_type="application/json"
            )
            return resp

它将通过以下 urlpattern 访问:

urlpatterns = [
    path('sendsms/', SMSView.as_view(), name="send_sms"),
    path('viewsms/', SMSView.as_view(), name="view_sms"),
]

但没有使用 python sms_messages_serializer.update(data={"delivery_status": True}partial=True) 成功更新实例它抛出类型错误:serializer.update()得到了意外的关键字参数'data'

我尝试更改 update在 SMSMessagesSerializer 类中无济于事,并尝试重命名 data属性为validated_datavalue但仍然不起作用。我需要它在发送短信后将delivery_status更新为True,我怎样才能做到这一点?

最佳答案

对于可能遇到此问题的任何人,我通过将 post() 方法中的 sms_messages_serializer.update() 方法更改为:

 sms_messages_serializer.update(sms_object,{"delivery_status": True})

其中sms_object=sms_object = sms_messages_serializer.save(),表示数据经过验证并保存后的sms_messages_serializer实例。

不需要data属性或partial=True

关于python - update() 抛出 TypeError : serializer. update() 得到意外的关键字参数 'data',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575057/

相关文章:

python - simplexml_load_string 等效于 Python/Django

python - Discord.py 模块 Python 3.6.4 踢功能

python - 尝试将视频分成图像阵列以用于ImageTk

python - 如何在 BeautifulSoup.contents 中保留空格

python - Spyder 变量资源管理器如何显示自定义数据类型?

python - 如何从 Django Channels 网络套接字数据包中获取当前用户?

python - 即使在 django 的 settings.py 中提供正确的设置后,数据库连接也无法工作

python - 删除单引号和分隔括号

python - 如何在 python 中逐行打印来自维基百科的抓取表?

python - 填满磁盘空间最快的方法是什么