愚蠢的提问时间。我似乎能够为Django模型创建一个对象,尽管我省略了一个被定义为NOT NULL的列,我不知道为什么。这是我的模型:
class Movie(models.Model):
name = models.CharField(max_length=256)
length_minutes = models.IntegerField()
rating = models.CharField(max_length=2)
class Meta:
db_table = 'movies'当我运行python manage.py sql时,我看到:
BEGIN;
CREATE TABLE "movies" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(256) NOT NULL,
"length_minutes" integer NOT NULL,
"rating" varchar(2) NOT NULL
);
COMMIT;此外,如果我从psql运行命令\d movies,我可以看到所有列都被指定为NOT NULL。
但我不明白的是。当我运行Python shell时,我可以发出以下命令,并且将创建一个包含空'name‘列的新行:
Movie.objects.create(length_minutes=120, rating='PG')但是,如果我发出(我认为是)等效的SQL命令:
INSERT INTO movies(length_minutes, rating) VALUES(120, 'PG');..。我得到了预期的错误:“错误:空值...违反了非空约束。”
为什么Django的ORM允许我创建一个没有NOT NULL CharField列参数的对象?它是否假定我使用的是模型验证器?如果是这样的话,它似乎是一个相当愚蠢和值得信任的ORM。
我使用的是Python2.7.1、Django1.4和PostgreSQL 9.1.4。
谢谢你的帮助。
发布于 2012-10-15 06:25:00
经过大量的在线研究和实验,我发现我上面描述的行为是正常的Django行为。显然,Django在默认情况下不会验证模型。此外,CharField的默认值是空字符串。为了确保Django在省略指定为NOT NULL的CharField参数时引发预期的IntegrityError,我需要在签名声明中添加"default=None“:
name = models.CharField(max_length=256, default=None)我回答了我自己的问题,我能得到信任吗?
发布于 2012-10-14 13:18:09
空字符串''不是NULL,它是空字符串。''是一个完全有效的非空值。如果您的应用程序不能接受''值,请添加一个CHECK约束,如下所示:
ALTER TABLE movies
ADD CONSTRAINT movie_name_length
CHECK (length(name) > 0);看起来Django,或者你的应用程序,假设当你不指定一个名字时,你想要一个空的名字'',而不是NULL。看the Django documentation for Field.null,这不是我所说的.安全..。但似乎暗示默认情况下没有值被视为''。
https://stackoverflow.com/questions/12879256
复制相似问题