首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Django管理创建复杂的Django模型验证?

如何为Django管理创建复杂的Django模型验证?
EN

Stack Overflow用户
提问于 2010-08-22 10:54:58
回答 2查看 1.8K关注 0票数 4

在Django中我有以下模型:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-22 13:28:25

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

有几种方法可以解决这个问题。如果您的用户只能使用您提供的表单创建Bout实例,那么表单的验证方法可以测试您提到的条件。例如:

代码语言:javascript
复制
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()方法来进行验证。

票数 1
EN

Stack Overflow用户

发布于 2010-08-22 18:19:38

虽然Manoj Govindan的回答看起来很好,但我也想出了自己的解决方案.如果有人觉得我的解决方案略短一些,我会在这里加入它:

代码语言:javascript
复制
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.')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3541201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档