首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Django ORM允许我在创建对象时省略非空字段的参数?

问为什么Django ORM允许我在创建对象时省略非空字段的参数?
EN

Stack Overflow用户
提问于 2012-10-14 12:16:45
回答 2查看 1.7K关注 0票数 7

愚蠢的提问时间。我似乎能够为Django模型创建一个对象,尽管我省略了一个被定义为NOT NULL的列,我不知道为什么。这是我的模型:

代码语言:javascript
复制
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时,我看到:

代码语言:javascript
复制
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‘列的新行:

代码语言:javascript
复制
Movie.objects.create(length_minutes=120, rating='PG')

但是,如果我发出(我认为是)等效的SQL命令:

代码语言:javascript
复制
INSERT INTO movies(length_minutes, rating) VALUES(120, 'PG');

..。我得到了预期的错误:“错误:空值...违反了非空约束。”

为什么Django的ORM允许我创建一个没有NOT NULL CharField列参数的对象?它是否假定我使用的是模型验证器?如果是这样的话,它似乎是一个相当愚蠢和值得信任的ORM。

我使用的是Python2.7.1、Django1.4和PostgreSQL 9.1.4。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 06:25:00

经过大量的在线研究和实验,我发现我上面描述的行为是正常的Django行为。显然,Django在默认情况下不会验证模型。此外,CharField的默认值是空字符串。为了确保Django在省略指定为NOT NULL的CharField参数时引发预期的IntegrityError,我需要在签名声明中添加"default=None“:

代码语言:javascript
复制
name = models.CharField(max_length=256, default=None)

我回答了我自己的问题,我能得到信任吗?

票数 12
EN

Stack Overflow用户

发布于 2012-10-14 13:18:09

空字符串''不是NULL,它是空字符串。''是一个完全有效的非空值。如果您的应用程序不能接受''值,请添加一个CHECK约束,如下所示:

代码语言:javascript
复制
ALTER TABLE movies
ADD CONSTRAINT movie_name_length 
CHECK (length(name) > 0);

看起来Django,或者你的应用程序,假设当你不指定一个名字时,你想要一个空的名字'',而不是NULL。看the Django documentation for Field.null,这不是我所说的.安全..。但似乎暗示默认情况下没有值被视为''。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12879256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档