删除时找不到 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)
我在通过 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)