4

私はDjangoに次のモデルを持っています:

class Bout (models.Model):
    fighter_1 = models.ForeignKey(Fighter, related_name="bout_fighter_1")
    fighter_2 = models.ForeignKey(Fighter, related_name="bout_fighter_2")
    winner = models.ForeignKey(Fighter, related_name="bout_winner", 
        blank=True, null=True, help_text='Leave blank for draw.') 
    date = models.DateField()
    cancelled = models.BooleanField()

私はその記録のために行政を「ばかげた」ものにしたい。ちなみに、私は3つのルールを作成したいと思います。

  1. ファイター1はファイター2と同じではありません(これはモンティパイソンスキットにのみ適しています)。

  2. 勝者は試合に参加する必要があります(つまり、ファイター1またはファイター2のいずれか)

  3. 試合が行われる前に勝者を設定することはできません。(結局のところ、これはWWEではありません。)

これらの3つのルールはすべて、同じレコード内の1つのフィールドを別のフィールドと照合する必要があります。ネイティブのdjangoメソッドを使用するか、Pythonに頼って、djangoでこれを行うことは可能ですか?

4

2 に答える 2

1

簡単な答え:「ネイティブdjangoメソッド」を使用してDjangoでこれを実現できます。「ネイティブDjangoメソッド」が正確に何を意味するのかわかりません。DjangoAPIを呼び出すことを意味していると思います。

これを行うには、いくつかの方法があります。Boutユーザーが提供したフォームを使用してのみインスタンスを作成できる場合、フォームの検証メソッドは、指定した条件をテストできます。例:

class BoutForm(forms.ModelForm):
    class Meta:
        model = Bout

    def clean(self):
        fighter_1 = self.cleaned_data.get('fighter_1')
        fighter_2 = self.cleaned_data.get('fighter_2')
        winner = self.cleaned_data.get('winner')  
        date = self.cleaned_data.get('date')

        if not (fighter_1 and fighter_2 and (fighter_1.id != fighter_2)):
            raise forms.ValidationError("Both fighters cannot be the same")

        if not (winner and (winner.id == fighter_1.id or winner.id == fighter_2.id)):
            raise forms.ValidationError("Winner is not in the fight")

        if not (date and date < datetime.today()):
            raise forms.ValidationError("Winner is not in the fight")

        return self.cleaned_data

上記のスニペットは不完全です。ニーズに合わせて微調整できます。また、Djangoの新しいfangledフォームバリデーターもご覧ください。

一方、ユーザーがAPIを使用してインスタンスを作成できる場合(たとえば、プログラムでクラスをインスタンス化することにより) 、クラスのメソッドをBoutオーバーライドして検証を行う必要があります。save()Bout

于 2010-08-22T13:28:25.403 に答える
0

Manoj Govindanの答えは非常に良さそうですが、私も独自の解決策を考え出しました...誰かが私の少し短い解決策が望ましいと思う場合に備えて、ここに含めます。

def clean(self):
    if self.fighter_1 == self.fighter_2:
        raise ValidationError('Fighter 1 can not be Fighter 2.')
    if (self.winner != self.fighter_1) and (self.winner != self.fighter_2):
        raise ValidationError('Winner must be in the bout.')
    if (self.date >= datetime.date.today()) and (self.winner):
        raise ValidationError('Winner can not be set before match.')
于 2010-08-22T18:19:38.667 に答える