缺少必需的django中的Charfield保存为空字符串,不会引发错误

时间:2016-09-27 00:15:12

标签: python mysql django

如果我尝试在Django 1.10中保存不完整的模型实例,我会期望Django引发错误。情况似乎并非如此。

models.py:

from django.db import models

class Essai(models.Model):
    ch1 = models.CharField(max_length=100, blank=False)
    ch2 = models.CharField(max_length=100, blank=False)

所以我有两个字段不允许为空(默认行为,Django在MySQL表创建时应用NOT NULL限制。我希望Django在存储之前没有设置其中一个字段时会出错。

但是,当我创建一个不完整的实例时,数据存储得很好:

>>> from test.models import Essai
>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.save()
>>> bouh.id
9
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
''
>>> 

我原本以为Django会引发错误。但是,如果我强制ch2None,则会引发错误:

>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.ch2 = None
>>> bouh.save()
Traceback (most recent call last):
  (...)
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: test_essai.ch2
>>> bouh.id
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
>>>

这是正常行为吗?我错过了什么?为什么Django在这个简单的情况下不会将错误引发为默认行为?

谢谢你的灯!

EDIT

我得到了一些回复,指出在SQL中空字符串""不等于NULL,如Django model blank=False does not work?中所述 但是,如果我们查看ModelForm行为,则django doc似乎存在不一致。

看问题 Followup : missing required Charfield in django Modelform is saved as empty string and do not raise an error

1 个答案:

答案 0 :(得分:-1)

  

使用此,

from django.db import models

class Essai(models.Model):
    ch1 = models.CharField(max_length=100)
    ch2 = models.CharField(max_length=100)