我希望用户只能为一个类别请求投票一次,但不知怎的,我出现了以下错误,我不知道如何“正确”调用该实例:
Cannot assign "1": "CategoryRequests_Voter.voted" must be a "CategoryRequests" instance.
你知道吗型号.py你知道吗
# Category Requests Model
class CategoryRequests(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
....
# Vote(s) of Category Requests Model
class CategoryRequests_Voter(models.Model):
voter = models.ForeignKey(User, on_delete=models.CASCADE)
voted = models.ForeignKey(CategoryRequests, on_delete=models.CASCADE)
published_date = models.DateField(auto_now_add=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
你知道吗视图.py你知道吗
def category_request_up_vote (request, pk):
category_request = get_object_or_404(CategoryRequests, pk=pk)
if request.method == 'GET':
if CategoryRequests_Voter.objects.filter(voter=request.user, voted=category_request.pk).exists():
messages.error(request, 'You already voted for this request.')
else:
category_request.up_vote = F('up_vote') + 1
category_request.save()
CategoryRequests_Voter.objects.create(voter=request.user, voted=category_request.pk)
messages.success(request, 'You have successfully Provided an Up-Vote for this Request')
return redirect('category_request_detail', pk=category_request.pk)
else:
messages.error(request, 'Uuups, something went wrong, please try again.')
return redirect('category_request_detail', pk=category_request.pk)
提前谢谢
您需要将
voted
参数固定为category_request
,而不是其主键,如:但是,您可以改进模型和视图以提高一致性和优雅性。为了防止
User
投票两次或更多,可以通过使用unique_together
约束,防止为同一voter
和voted
创建CategoryRequest_Voter
对象两次:此外,我们可以使用
get_or_create
,从而只从数据库中获取一个数据。通常,更改数据的视图应该通过POST请求而不是GET来完成。GET请求不应该有副作用。你知道吗可能值得计算
CategoryRequest_Voter
的数量,而不是增加投票计数,因为有可能,例如由于删除User
或投票,最终投票数量不再与该CategoryRequests
对象的CategoryRequests_Voter
数量协调。你知道吗也许计算每个投票的对象数并不是那么有效,但是您可以让一个任务时不时地运行,从而计算:
计算给定
category_request
的CategoryRequests_Voter
个数。你知道吗相关问题 更多 >
编程相关推荐