Django 迁移错误:字段“名称”没有默认值
Posted
技术标签:
【中文标题】Django 迁移错误:字段“名称”没有默认值【英文标题】:Django migration error: Field 'name' doesn't have a default value 【发布时间】:2019-07-27 04:36:18 【问题描述】:我有一个最近从 1.4.5 升级到 1.11.16 的 Django 应用程序。它在旧版本的 debian linux 上运行,该版本已重新安装,现在是 9.6 。原来数据库是 mysql(默认 debian 安装),现在是 mariadb(也是默认安装)。
由于项目很小,基本上没有数据库优化,几乎所有东西都在默认设置下运行。在重新安装和升级之前,数据库已被转储并稍后加载。最初它使用 myisam 表类型,但现在默认为 innodb。
每当我尝试使用最简单的设置创建新表(django 模型)时,例如。 g.:
class Sth(models.Model):
car = models.CharField(max_length=128)
我面临以下警告:
/home/user/.virtualenvs/prj/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py:101: Warning: Field 'name' doesn't have a default value
返回 self.cursor.execute(query, args)
。它是什么意思,为什么会出现?如果设置了严格模式,甚至会变成错误。
这个问题的解决方案是什么?了解了debian系统(mysql -> mariadb)和django升级(1.4.5 -> 1.11.16)的变化,我应该怎么想?
我也尝试将当前表更改为innodb,并将默认mariadb类型更改为myisam,但没有帮助。
运行迁移时mysql日志中的sql查询:
CREATE TABLE `infokom_sth` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `car` varchar(128) NULL)
INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('infokom', '0004_sth', '2019-03-05 22:25:54.360285')
INSERT INTO `django_content_type` (`app_label`, `model`) VALUES ('infokom', 'sth')
INSERT INTO `auth_permission` (`name`, `content_type_id`, `codename`) VALUES ('Can add sth', 27, 'add_sth'), ('Can change sth', 27, 'change_sth'), ('Can delete sth', 27, 'delete_sth')
【问题讨论】:
你尝试设置null=True
吗?
是的,试过了。即使我尝试使用 blank=True 并设置默认值,例如 default='-' 。
什么我不明白,这个字段叫什么名字。我在新模型中没有名为 name 的列。
你见过this question吗?
不,不过谢谢,似乎很有用。
【参考方案1】:
当 Django 运行查询 INSERT INTO django_content_type (app_label, model) VALUES ('infokom', 'sth')
时出现错误,因为它没有指定列 name
。
在早期版本的 Django 中,django_content_type
表中有一个列 name
,但它在 1.4 和 1.10 之间的某个时间被删除了。
迁移没有删除额外的列,因此您必须手动删除 django_content_type.name
。
我在 1.10 上遇到了同样的错误,然后删除了 django_content_type.name
,然后迁移对我来说很好。
【讨论】:
以上是关于Django 迁移错误:字段“名称”没有默认值的主要内容,如果未能解决你的问题,请参考以下文章