我正在将我们的项目从python 2升级到3,并观察到有关使用空值创建/保存对象的不一致行为。
考虑使用CharField
(并且不 default=''
)定义的null=True
在python 2分支上,创建该字段设置为None的对象会导致异常,但是一旦创建,将该字段设置为None,然后保存就可以正常工作(尽管None
会转换为''
,可能是Django)
在python 3分支上,为同一模型使用field=None
创建和更新会导致异常(IntegrityError
)。
我不确定预期的行为是什么,如果某个字段未定义null=True
,则在用None更新该字段时会出错。但是,使用None进行保存显然已经在python 2分支上工作了一段时间(几年了)..除非那是一个bug而不是一个功能?
有人遇到过同样的问题吗?
note :两个分支都具有相同的Django(目前为1.9,在python 3转换后更新为2),相同版本的MySQL(5.7.22),python 2分支在Ubuntu 14.04上运行,和python 3 on 16.04。
更新:
我已决定清理将没有将null=True
设置为None
的任何字段的代码。
我的意思是,定义一个不可为空的字段,然后将其设置为null,谁来做呢? :D
更严重的是,有人可以确认Django ORM在任何时候是否都很聪明,并将None
值转换为空字符串吗?我正在处理的某些代码已经很老了,也许它符合编写本文时的预期。仍然无法确定..但正如我的案例所示,这种行为可能并不可靠,所以我正在做更明智的事情。