Python 更新对象时的Django IntegrityError

Python 更新对象时的Django IntegrityError,python,django,python-3.x,django-orm,Python,Django,Python 3.x,Django Orm,我正在将我们的项目从Python2升级到Python3,并观察到关于创建/保存空值对象的不一致行为 考虑使用default=''定义的CharField(以及不使用null=True的) 在Python2分支上,创建一个字段设置为None的对象会导致异常,但一旦创建,将字段设置为None,然后保存,就可以正常工作(尽管None被转换为',可能是Django) 在Python3分支上,为同一模型创建和更新field=None,会导致异常(IntegrityError) 我不确定预期的行为是什么,如

我正在将我们的项目从Python2升级到Python3,并观察到关于创建/保存空值对象的不一致行为

考虑使用
default=''
定义的
CharField
(以及不使用
null=True的

在Python2分支上,创建一个字段设置为None的对象会导致异常,但一旦创建,将字段设置为None,然后保存,就可以正常工作(尽管
None
被转换为
'
,可能是Django)

在Python3分支上,为同一模型创建和更新
field=None
,会导致异常(
IntegrityError

我不确定预期的行为是什么,如果一个字段没有定义
null=True
,那么在更新该字段时出错是有意义的。然而,保存而不保存显然已经在Python2分支上工作了一段时间(几年)…除非这是一个bug而不是一个特性

以前有人遇到过同样的问题吗

注意:两个分支都有相同的Django(目前为1.9,在Python3转换后更新为2),相同版本的MySQL(5.7.22),Python2分支在Ubuntu 14.04上运行,Python3分支在16.04上运行

更新

我决定清理将任何不带
null=True的字段设置为
None
的代码

我的意思是,定义一个不可为null的字段,然后将其设置为null,谁会这样做??:D


更严重的是,有人能确认Django ORM是否在任何时候都是智能的并将
None
值转换为空字符串吗?我正在处理的一些代码非常旧,可能它做了编写时所期望的事情。不过,我还是不能确定。。但是,正如我的案例所示,这种行为可能不可靠,因此我正在做更明智的事情。

目前的解决方案听起来很老套。您需要一个空白的默认值,然后用None覆盖默认值。。。它正在数据库中存储null。这是一种实现null=True的复杂方法。您已经在数据库中存储null,并且已经在重构代码。这听起来是一个正确重写这些模型的好机会。谢谢,@ShaunOverton,你的建议很有道理,我完全同意。然而,我对这里的预期行为有点困惑,当您将None设置为
null=False
的字段时,它应该默默地将其转换为默认值(如在python2分支上)还是抛出IntegrityError(如在python3分支上)?事实上,我甚至不确定这是由python版本引起的,但也不确定应该在哪里查找:\n如果有疑问,请进行测试。调出pgadmin,在更改实例状态和模型配置时查看数据库中的实际内容。我不确定,但存储值可能因数据库类型而异。@ShaunOverton我想你误解了我的问题,我在这两种情况下都使用MySQL。正如在我的原始帖子中所描述的,在我的python 2分支上,
None
被保存为DB中的空字符串,但是在python 3分支上,在同一字段中使用None保存会导致IntegrityError。我感觉Python3分支的行为是正确的,但Django ORM也可能会将空值静默地转换为默认值,在本例中为空字符串。我只是想了解是什么导致了这种行为上的差异。