我在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与战斗机2不同(仅适用于monty python skit)。
获胜者应该在回合中(即战斗机1或战斗机2)
在比赛开始前无法设置获胜者。 (毕竟,这不是WWE。)
这三条规则都需要在同一记录中的另一个字段中检查一个字段。是否可以在django中执行此操作,使用本机django方法或使用python?
答案 0 :(得分: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的新奇form validators。
另一方面,如果您的用户可以使用API创建实例(例如,通过在其程序中实例化Bout
类),那么您将必须通过覆盖save()
方法来进行验证Bout
类。
答案 1 :(得分: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.')