gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:02:30 25 4
gpt4 key购买 nike

我正在尝试在已成功发送消息后更新已数据库保存的对象。它调用序列化器类的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com