加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何为Django Admin创建复杂的Django模型验证?

发布时间:2020-12-20 13:20:57 所属栏目:Python 来源:网络整理
导读:我在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="
我在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?

解决方法

简短的回答:你可以使用“原生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类),那么您将必须通过覆盖Bout类的save()方法来进行验证.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读