2016-04-17 15 views
0

私たちはDjangoのチュートリアル https://docs.djangoproject.com/en/1.9/intro/tutorial07/複数の外部キーの検証

にポーリングアプリを使用する私たちは、管理者には、次の

class Choice(models.Model): 
    question = models.ForeignKey(Question, 
           on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

    def clean(self): 
     super(Choice, self).clean() 
     choice_list = Choice.objects.filter(question=self.question) 
     choice_list_text = [a.choice_text for a in choice_list if a.pk != self.pk] 
     choice_list_text.append(self.choice_text) 
     if len(set(choice_list_text)) != len(choice_list_text): 
      raise ValidationError("You have duplicate entries") 

    def __str__(self): 
     return self.choice_text 

により重複選択項目テキストを防ぐために選択モデルを変更することができ、選択モデルは質問フォームとインラインです。つまり、インライン選択が1つずつ編集されると、検証は100%機能します。次のように私たちは、ケースを持つことができます

Choice: A choice, Votes: 0 
Choice: Another choice, Votes: 0 

は、保存されたとき、これはValidationErrorを上がります

Choice: Another choice, Votes: 0 
Choice: A choice, Votes: 0 

を交換しました。

このようなケースを許可したい場合、どのように検証をコードしますか?それが不可能な場合は、1つのエントリが管理フォームで編集されている場合、他のインラインモデルエントリを編集できないようにすることは可能ですか?

答えて

0

私はあなたがやっていることが、多くのdjangoのすぐ使えるformsetロジックをカスタマイズすることなく可能ではないと思います。他のインラインエントリを編集不可能にすると、2つの切り替えエントリのいずれも単独で保存することができないため、この例では役に立ちません。しかし一つのこと:

代わりの検証のためcleanをオーバーライドし、あなたのケースでは、あなたはunique_togetherを使用する必要があります。

class Choice(models.Model): 
    # ... 
    class Meta: 
     unique_together = (('question', 'choice_text'),) 

これは、デシベルレベルで各質問のためのユニークな選択肢を施行し、cleanに依存しません呼び出される。