2017-08-29 3 views
0

Djangoを使用して登録ユーザーを1回だけ投票するように制限している投票システムを設定しようとしています(利用可能なオプションが複数あるにもかかわらず、強く同意しています)。これまでのところ、私は同じ正確な投票をすることができないシステムを作ることができました(つまり、「同意する」ことはできません)が、投票を変更することができます。 「同意する」に投票し、「同意しない」と再度投票することができます)。トピックごとに1票に制限されるようにしたいので、これを達成するために自分のコードを調整する方法を理解できません。可能な選択肢が複数ある場合は重複投票を禁止しますか?

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) 
+0

あなたは 'Topic'モデル、チョイス」モデルと「VoterChoice」の属性' topic'、 '利用者「を有しVoterChoice」モデルを、持っているあなたのモデルを再設計することもできます'、' choice'、および( 'topic'、' user')の一意制約です。 – azalea

+0

私はどのくらいユニークな制約をそこに置くのですか?あなたが言及したトピック/ユーザー/選択モデルは、私の予測/選択/投票者モデルと同等であると信じています。私が本当に苦労している唯一の部分は、ユニークな制約を置いて有権者を制限していると思います。 – yoursweater

答えて

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"),) 
関連する問題