Django模型:如何在字段上设置这些数据库约束?

时间:2013-06-09 05:02:25

标签: django-models

假设我有以下模型:

class myClassObj(models.Model):
    flag1 = models.NullBooleanField() 
    flag2 = models.BooleanField() 

现在也假设我希望数据库强制执行以下约束:

flag1 should be None if and only if flag2 is false

如何在此模型中编写约束,以便在创建或编辑myClassObj时检查此条件?我看到了一些有趣的信息here。但我没有看到如上所述如何指定“iff”约束。

1 个答案:

答案 0 :(得分:0)

Django文档建议进行自定义验证,通过覆盖Model.clean()来访问多个字段。

文档中的这个示例显示了如何验证仍处于“草稿”阶段的新闻文章是否没有发布日期。

def clean(self):
    import datetime
    from django.core.exceptions import ValidationError
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
        raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
        self.pub_date = datetime.date.today()

有关详细信息,请参阅此处的完整参考:https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

要在每次保存对象时调用此对象,您还需要覆盖保存方法:https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

如果您只需要验证单个字段,则其他用例的另一个有用参考是编写自定义验证器:https://docs.djangoproject.com/en/dev/ref/validators/