在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()我想为政府的记录提供“白痴证明”。顺便说一句,我想创建三个规则:
所有这三条规则都要求检查一个字段与同一记录中的另一个字段。在django中可以这样做吗,要么使用本地django方法,要么使用python?
发布于 2010-08-22 13:28:25
简短的回答:您可以在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类),那么您必须通过重写Bout类的save()方法来进行验证。
发布于 2010-08-22 18:19:38
虽然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.')https://stackoverflow.com/questions/3541201
复制相似问题