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()

我想对政府进行“白痴证明”以供其记录。顺便说一句,我想创建三个规则:

  1. 战斗机 1 与战斗机 2 不同(仅适用于巨蟒短剧)。

  2. 获胜者应该在回合中(即,战斗机 1 或战斗机 2)

  3. 比赛开始前无法确定胜者。(毕竟,这不是 WWE。)

所有这三个规则都要求检查同一记录中的一个字段与另一个字段。是否可以在 django 中执行此操作,使用本机 django 方法或求助于 python?

4

2 回答 2

1

简短的回答:您可以在 Django 中使用“本机 django 方法”来实现这一点。我不确定您所说的“本机 Django 方法”到底是什么意思;我假设您的意思是调用 Django API。

有几种方法可以解决这个问题。如果您的用户只能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 新奇的表单验证器

另一方面,如果您的用户可以使用 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 回答