将字段添加到 Django 的现有数据库(版本 < 1.7)

Posted

技术标签:

【中文标题】将字段添加到 Django 的现有数据库(版本 < 1.7)【英文标题】:Adding fields to an already existing database for Django (version < 1.7) 【发布时间】:2011-07-06 05:58:42 【问题描述】:

我正在使用 Django (

我正在尝试向现有模型的类添加一个新字段。这个类已经有与之关联的数据。

manage.py syncdb 没有将新字段添加到数据库中。

有没有办法:

    将新字段添加到已经存在的类中,并确保为其分配了 db 条目?

    为所有已经存在的数据库条目用一个空字符串填充这个新字段?

【问题讨论】:

【参考方案1】:

此答案仍在广为人知,但已过时。从 1.7 开始,Django 附带了 built-in migration 系统,由与 South 相同的作者编写,并且已弃用 syncdb,尽管它仍然可以工作。

您只需运行一些命令即可自动添加新列:

python manage.py makemigrations  
python manage.py migrate

了解幕后发生的事情会很有用,但这些是基础知识。如果您仍在阅读这篇旧文章,请提出新问题以获得有关 1.7 和迁移的答案。


对于 django

syncdb 不会添加任何新列。看 http://docs.djangoproject.com/en/dev/ref/django-admin/#syncdb

您必须手动添加它们。例如,。将&lt;&gt; 替换为相关信息:

python manage.py dbshell
ALTER TABLE <appname_modelname> ADD COLUMN <column_type> DEFAULT '';

您可以使用以下命令查看 Django 为在新的 syncdb 上生成列可能做了什么:

python manage.py sqlall app_name

并从那里复制和粘贴ALTER TABLE 语句。

否则,您可以查看第三方应用程序,例如 Django-South,它们是数据库迁移工具。

【讨论】:

+1 简单,适用于所有数据库,尤其是 sqlall 建议。 虽然这很有效,但更好的方法是在创建迁移脚本时使用 south。 @poorva 我在帖子中确实提到了 south,但实际上 django 1.7+ 已经内置了迁移功能,并且不再需要 south。 @Yuji'Tomita'Tomita:一个非常好的答案!但你能告诉我,如果我必须通过在models.py中创建新类来添加一些新表,其中已经有一些类和对应的数据表,那么我怎样才能在不干扰以前数据的情况下做到这一点?如果要使用上述命令,则在我键入 python manage.py makemigrations my-app-label 并且不会创建新表时立即引发一些警告。【参考方案2】:

在您的 django 中安装 south,您可以轻松处理现有表。检查this

如果你真的想使用 Django-South,请在将新字段添加到现有模型运行后,将其安装在 django 上

python manage.py schemamigration --initial

它将在您的项目应用程序中创建一个文件。那么,

python manage.py 迁移

那就是你的桌子被改变了。

【讨论】:

thx 我认为这就是我想要的。 Yuji手动修改db的方法也很有意思。我会在早上首先测试这两种方法! 南方不再相关。请更新您的答案【参考方案3】:

还有其他迁移应用程序选项(尽管 South 是最常用的)。

我在我的项目中使用了django-evolution,它非常易于安装和开始使用。

South 似乎更完整,但对于更简单的任务,django-evolution 可能更适合。

【讨论】:

以上是关于将字段添加到 Django 的现有数据库(版本 < 1.7)的主要内容,如果未能解决你的问题,请参考以下文章

向现有 django 模型添加新的唯一字段时的最佳实践

XSLT 如何组合模板并将现有字段添加到某些元素

Django:如何将 2 天添加到用户输入的现有日期

将密码字段迁移到 Django

Django - 禁用表单集中现有表单的编辑,但允许在新表单中编辑

Django Rest Frame API:ModelSerializer 中的附加字段