[英]How to perform UPDATE and DELETE operation in Django rest framework
[英]Perform update on Django Rest Framework
我有一個 class 在一個實例中添加了許多點,但我想限制它,以便只有一個用戶可以投票一個答案。 一個用戶不能做兩次,但其他用戶也只能投票一次:
class AddPointsAnswer(generics.UpdateAPIView):
queryset = Answer.objects.all()
serializer_class = AddPointsSerializer
def get_queryset(self):
return super().get_queryset().filter(
id=self.kwargs['pk']
)
def perform_update(self, serializer):
if not serializer.addition_done and self.request.user not in serializer.voters.all():
serializer.number_of_points += 1
serializer.addition_done = True
serializer.save()
class Answer(models.Model):
answer = models.TextField()
created_at = models.DateTimeField(editable=False, default=timezone.now)
updated_at = models.DateTimeField(default=timezone.now)
user = models.ForeignKey('users.CustomUser', on_delete=models.PROTECT)
question = models.ForeignKey('Question', on_delete=models.PROTECT)
number_of_points = models.IntegerField(default=0)
moderate_status = models.BooleanField(default=False)
addition_done = models.BooleanField(default=False)
subtraction_done = models.BooleanField(default=False)
voters = models.ManyToManyField('users.CustomUser', default=None, blank=True, related_name='voters')
class AddPointsSerializer(serializers.ModelSerializer):
class Meta:
model = Answer
fields = ('number_of_points', 'addition_done')
但我收到這樣的錯誤
Internal Server Error: /api/v1/answers/2/addpoints
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/generic/base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/generics.py", line 226, in put
return self.update(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/mixins.py", line 68, in update
self.perform_update(serializer)
File "/Users/jakubstrawa/programming/gitlabdeor/api/questions/views.py", line 104, in perform_update
if not serializer.addition_done and self.request.user not in serializer.voters.all():
AttributeError: 'AddPointsSerializer' object has no attribute 'addition_done'
你知道為什么嗎?
數據不在序列化程序中,而是在 serializer.data / serializer.validated_data
盡管您應該在validate
中編寫檢查。
class AddPointsAnswer(generics.UpdateAPIView):
queryset = Answer.objects.all()
serializer_class = AddPointsSerializer
def get_queryset(self):
return super().get_queryset().filter(
id=self.kwargs['pk']
)
def perform_update(self, serializer):
addition_done = serializer.data.get('addition_done', False)
number_of_points = serializer.data.get('number_of_points', 0)
if not addition_done and self.request.user not in serializer.voters.all():
number_of_points += 1
addition_done = True
serializer.save(addition_done=addition_done, number_of_points=number_of_points)
# serializer.save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.