簡體   English   中英

在 Django Rest 框架上執行更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM