当有多个可能的选择时,防止重复投票?

时间:2017-08-29 19:49:49

标签: python django sqlite

我正在尝试建立一个使用Django的投票系统,限制注册用户在一次投票中只投票一次(尽管有多个选项可用/非常同意/不同意)。到目前为止,我已经能够建立一个他们无法进行同样投票的系统(因此他们不能投票“同意”两次),但他们可以改变他们的投票并且它仍然会通过(所以他们可以投票“同意”,然后再次投票为“不同意”)。我希望他们被限制为每个主题一票,我不知道如何调整我的代码来实现这一目标。以下是我的观点:

def vote(request, prediction_id):
    prediction = get_object_or_404(Prediction, pk=prediction_id)
    selected_choice = prediction.choice_set.get(pk=request.POST['choice'])

    if Voter.objects.filter(prediction=prediction, choice=selected_choice, user_id=request.user.id).exists():

        return render(request, 'predictions/detail.html', {
            'prediction': prediction,
            'error_message': "Sorry, but you have already voted."
        })

    else:

        selected_choice.votes += 1
        selected_choice.save()
        Voter.objects.create(prediction=prediction, choice=selected_choice, user_id=request.user.id)

    return HttpResponseRedirect(reverse('predictions:results', args=(prediction.id,)))

以下是我的模特:

class Prediction(models.Model):
    prediction_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    # ...
    def __str__(self):
        return self.prediction_text

class Choice(models.Model):
    prediction = models.ForeignKey(Prediction, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __str__(self):
        return self.choice_text

class Voter(models.Model):
    user = models.ForeignKey(User)
    choice = models.ForeignKey(Choice)
    prediction = models.ForeignKey(Prediction)

1 个答案:

答案 0 :(得分:0)

if Voter.objects.filter(prediction=prediction, user_id=request.user.id).exists()

此行代码表示此用户是否已选择投票。

如果我可以理解,那么预测类就是问题"。所以其他解决方案是:

class Voter(models.Model):
    user = models.ForeignKey(User)
    choice = models.ForeignKey(Choice)
    prediction = models.ForeignKey(Prediction)

Meta:
    unique_together = (("driver", "prediction"),)