如何使用django将这些约束强加于我的模型?

时间:2011-06-06 12:02:54

标签: python django-models

这是我的模特:

class MyModel(models.Model):
  s1 = models.CharField(max_length=255)
  s2 = models.CharField(max_length=255)

我期待django不允许我将空字符串视为有效,因为我在文档中读到blanknull默认为false。例如:

python manage.py shell

>>> a = MyModel()
>>> a.s1
''
>>> a.save()
>>> a.id()
1

为什么不引发字符串为空的异常?还有,没有min_length这样的东西吗?我想将我的字段限制为至少3个字符。

1 个答案:

答案 0 :(得分:2)

blank是与验证相关的属性,这意味着它仅适用于通过django-admin网站输入数据或使用ModelForm从模型派生的表单。

示例:

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

>>> f = MyForm({"s1":""})
>>> f.is_valid()
False
>>> f = MyForm({"s1":"hello world"})
>>> f.is_valid()
True
>>> a = f.save()
>>> a
<MyModel: MyModel object>
>>> a.id
10

<强> MIN_LENGTH

min_length确实存在,但作为forms.CharField而不是models.CharField的参数。

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
    s1 = forms.CharField(min_length=3, max_length=100)


>>> f = MyForm({"s1":"12"})
>>> f.is_valid()
False
>>> f = MyForm({"s1":"1234"})
>>> f.is_valid()
True

在未指定的字段上添加例外(没有表单)

通过设置default=None,字段默认为NULL而不是"",这会在手动保存模型时引发异常(除非指定null=True)。

class MyModel(models.Model):
  s1 = models.CharField(max_length=255, default=None)


>>> m = MyModel()
>>> m.save()
Traceback (most recent call last):
  File "<console>", line 1, in ?
  <.... trimmed for brevity ...>
  File "/usr/lib/python2.3/site-packages/django/db/backends/sqlite3/base.py", line 193, in execute
    return Database.Cursor.execute(self, query, params)
IntegrityError: test_mymodel.s1 may not be NULL

我只在django的旧版本上测试了这个,所以YMMV

更新

从1.2开始,django模型带有validation built-in,这意味着您可以通过调用Model.full_clean()来触发验证功能,而无需使用ModelForm。

class MyModel(models.Model):
    s1 = models.CharField(max_length=100)

    def save(self, *args, **kwargs):
        self.full_clean()
        Super(MyModel, self).save(*args, **kwargs)


>>> m = MyModel()
>>> m.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/tmp/lsc/playground/zoo/models.py", line 42, in save
    self.full_clean()
  File "/usr/lib/pymodules/python2.6/django/db/models/base.py", line 881, in full_clean
    raise ValidationError(errors)
ValidationError: {'s1': [u'This field cannot be blank.']}
相关问题