删除时找不到 Django 休息框架详细信息

Django rest framework Detail not found while deleting

我在通过 API 删除对象时遇到问题。所以我有 2 个模型,Answer 和 Vote 投票通过这样的外键连接到 Answer

class Vote(models.Model):
    class AnswerScore(models.IntegerChoices):
        add = 1
        subtract = -1

    score = models.IntegerField(choices=AnswerScore.choices)
    answer = models.ForeignKey('Answer', on_delete=models.PROTECT)
    user = models.ForeignKey('users.CustomUser', on_delete=models.PROTECT)

    class Meta:
        unique_together = ('answer', 'user',)

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)

现在我有一个 API 端点,用于为特定答案的用户创建投票

    path('answers/<int:pk>/vote', VoteCreate.as_view()),

看起来像这样:

class VoteSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    answer = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Vote
        fields = '__all__'


class VoteCreate(ParentKeyAPIView, generics.CreateAPIView):
    model = Vote
    parent_model_field = 'answer_id'
    serializer_class = VoteSerializer

    def perform_create_kwargs(self, **kwargs):
        answer_id = self.kwargs['pk']
        answer = Answer.objects.get(id=int(answer_id))

        if Vote.objects.filter(user=self.request.user, answer=answer).exists():
            old_vote = Vote.objects.get(user=self.request.user, answer=answer)
            answer -= old_vote.score
            answer.save()
            old_vote.delete()

        return super().perform_create_kwargs(user=self.request.user, answer_id=answer_id, **kwargs)


我正在使用与上面相同的序列化程序*

我收到一个错误: 未找到:/api/v1/answers/55/voteDelete 没有任何追溯,事实上我已经检查过在数据库中存在 answer_id 55 的投票,我可以通过 django-admin 删除它们但不能通过 API。 你知道为什么吗?

首先 - 让我们将 get_queryset 更改为 get_object,因为您需要单个对象。然后将 answer_id=self.kwargs['pk'] 简化为 answer=self.kwargs['pk'].

另一件事 - 我认为在创建新投票时删除旧投票可能更好。您不需要序列化程序或特殊视图。只需添加到在您的视图中创建新 Vote 对象的函数:

class VoteCreate(...):
    ...
    def perform_create_kwargs(self, **kwargs):
        answer_id = self.kwargs['pk']
        answer = Answer.object.get(id=int(answer_id))

        if Vote.objects.filter(user=self.request.user, answer=answer).exists():
            old_vote = Vote.objects.get(user=self.request.user, answer=answer)
            answer.number_of_points -= old_vote.score
            answer.save()
            old_vote.delete()

        return super().perform_create_kwargs(user=self.request.user, answer_id=answer_id, **kwargs)