Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Django ORM允许我在创建对象时忽略非空字段的参数?_Python_Django_Postgresql_Django Models - Fatal编程技术网

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

Python 为什么Django ORM允许我在创建对象时忽略非空字段的参数?,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,愚蠢的提问时间。我似乎能够为Django模型创建一个对象,即使我省略了一个定义为NOTNULL的列,我也不明白为什么。这是我的模型: class Movie(models.Model): name = models.CharField(max_length=256) length_minutes = models.IntegerField() rating = models.CharField(max_length=2) class Meta:

愚蠢的提问时间。我似乎能够为Django模型创建一个对象,即使我省略了一个定义为NOTNULL的列,我也不明白为什么。这是我的模型:

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
,我可以看到所有列都被指定为
非NULL

但我不明白的是。当我运行Python shell时,我可以发出以下命令,并将创建一个具有空“name”列的新行:

Movie.objects.create(length_minutes=120, rating='PG')
但是,如果我发出(我认为是)等效的SQL命令:

INSERT INTO movies(length_minutes, rating) VALUES(120, 'PG');
。。。我得到了预期的错误:“error:null值……违反了notnull约束。”

为什么Django的ORM允许我创建一个缺少
notnull
CharField列参数的对象?它是否假设我正在使用模型验证器?如果是这样,它似乎是一个相当愚蠢和信任的ORM

我正在使用Python 2.7.1、Django 1.4和PostgreSQL 9.1.4

谢谢您的帮助。

空字符串
'
不是
NULL
,而是空字符串<代码>'是一个完全有效的非空值。如果应用程序不能接受
'
值,请添加
检查
约束,如:

ALTER TABLE movies
ADD CONSTRAINT movie_name_length 
CHECK (length(name) > 0);

看起来Django或您的应用程序假设,当您不指定名称时,您希望使用空名称
'
,而不是
NULL
。看,这不是我所说的。。。清楚的但是似乎表明默认情况下没有值被视为

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

name = models.CharField(max_length=256, default=None)

回答我自己的问题,我能得到表扬吗?

当你运行Django命令
Movie.objects.create(rating='PG')
时,产生了什么样的SQL?在Django中启用SQL日志记录,或在
postgresql.conf
中启用
log\u语句='all'
,然后检查postgresql日志。在这里显示Django生成的语句。就我个人而言,我想知道Django是否没有将查询刷新到数据库,因此还没有产生错误。好的。下面是日志显示的内容:在“movies”(“name”,“rating”)中插入返回“movies.”“id”的值(“,”PG”);args=('',PG')。因此,如果我省略'name'参数,它将插入一个空格。正如我前面所指出的,我正在从Python shell执行“Movie.objects.create…”命令。我刚刚确认,如果我从Django视图运行它,我会得到相同的结果。。。将在“电影”表中创建一个新对象。同样,我也希望出现某种类型的SQL异常。Postgres会不会告诉Django,“嘿,你正在尝试为一个非NULL的字段插入一个没有值的行。你应该代表我抛出一个异常?”你应该查看field.NULL和field.blank。但是我确实在这篇文章的顶部显示了我的模型定义。根据Django文档,除非我在模型中另外指定(我没有指定),否则默认情况下所有字段都不是空的。ORM允许我执行一个命令,如果我用SQL编写它,就会触发一个错误。它允许我完全省略一个被指定为NOTNULL的列,这个列看起来很奇怪。@RobertF。啊,对不起。阅读失败。编辑。至于
notnull
——我同意Django的行为是奇怪的,它不应该在没有提供值的情况下假设空字符串。不过,它看起来纯粹是Django内部的东西,与PostgreSQL无关。@RobertF。Django文件表明这是预期的行为,尽管解释是。。。不清楚的。请参阅:。正如我所能猜到的,它试图说文本字段的“无值”被视为
。为了好玩,我在顶部显示的模型中添加了一个额外的字段“length\u minutes=models.IntegerField()”。如果我执行“Movie.objects.create(…)”并省略此字段的一个参数,Python将抛出我所期望的IntegrityError。Python/Django只允许我省略CharFields的NOTNULL参数。仍在研究这个问题。我在CharField模型签名中添加了“blank=False”,用于名称和评级字段,这是因为Django 1.4文档在声明这是默认值时不正确。不幸的是,ORM仍然允许我创建新的电影对象,即使我完全忽略了名称和分级参数。我的SQL日志显示ORM生成以下内容:插入到“movie”(“name”,“length”,“rating”)值(“”,100,“”)中,返回“movie”。“id”;args=('',100'')你刚刚帮我省了很多研究。我已经为另一个兔子洞做好了准备。非常感谢。