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

Python 如何使用django将这些约束强加给我的模型?,python,django-models,Python,Django Models,这是我的模型: class MyModel(models.Model): s1 = models.CharField(max_length=255) s2 = models.CharField(max_length=255) 我希望django不允许我将空字符串视为有效字符串,因为我在文档中读到,blank和null都默认为false。例如: python manage.py shell >>> a = MyModel() >>> a.s1 '' &

这是我的模型:

class MyModel(models.Model):
  s1 = models.CharField(max_length=255)
  s2 = models.CharField(max_length=255)
我希望django不允许我将空字符串视为有效字符串,因为我在文档中读到,
blank
null
都默认为false。例如:

python manage.py shell

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

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

blank
是一个与验证相关的属性,这意味着它仅在通过django管理站点输入数据或使用
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
引发未指定字符字段的异常(无表单)

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

类MyModel(models.Model):
s1=models.CharField(最大长度=255,默认值=无)
>>>m=MyModel()
>>>m.save()
回溯(最近一次呼叫最后一次):
文件“”,第1行,是否在中?
文件“/usr/lib/python2.3/site packages/django/db/backends/sqlite3/base.py”,执行中的第193行
返回Database.Cursor.execute(self、query、params)
IntegrityError:test_mymodel.s1不能为空
我只在django so YMMV的旧版本上测试过这个

更新 从1.2版开始,django模型随附,这意味着您可以通过调用触发验证函数,而无需使用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.']}
类MyModel(models.Model):
s1=models.CharField(最大长度=100)
def保存(自身、*args、**kwargs):
self.full_clean()
超级(MyModel,self).save(*args,**kwargs)
>>>m=MyModel()
>>>m.save()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/lsc/playery/zoo/models.py”,第42行,保存
self.full_clean()
文件“/usr/lib/pymodules/python2.6/django/db/models/base.py”,第881行,完全干净
引发验证错误(错误)
ValidationError:{'s1':[u'此字段不能为空。']}
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
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.']}