缺少所需的Charfield在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)

所以我有两个字段不允许为空(默认行为,NOT NULL限制是由Django在MySQL表创建应用)。如果其中一个字段在存储之前没有设置,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会抛出一个错误。但是,如果我将ch2强制为None,则会引发错误:

>>> 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模型中所述空白=False不工作?然而,如果我们看一下ModelForm的行为,在django doc中似乎有一个不一致的地方。

看到问题后续:django Modelform中缺少必需的Charfield被保存为空字符串,并且不会引发错误

使用这个,

from django.db import models
class Essai(models.Model):
    ch1 = models.CharField(max_length=100)
    ch2 = models.CharField(max_length=100)

最新更新