在不删除表的情况下更改模型中的 Django 数据类型

Posted

技术标签:

【中文标题】在不删除表的情况下更改模型中的 Django 数据类型【英文标题】:Changing the Django data type in models without dropping the table 【发布时间】:2011-07-19 10:28:48 【问题描述】:

我创建了一个 Django 应用程序。现在我想更改模型中我的 db 字段 1 的字段类型。由于当前类型的数据库中已经有一些记录,我想不可能通过简单地在models.py中更改类型来更改类型。通过谷歌搜索,我知道可以通过 sql 控制台更改它而无需删除表。但作为一个 Django 新手,我无法做到这一点。有人可以帮我做到这一点吗?这是我的models.py

class EmployeeDetails(models.Model):
    userName = models.CharField(max_length=200)
    designation = models.CharField(max_length=200)
    employeeID = models.IntegerField()
    contactNumber = models.CharField(max_length=200)
    project = models.CharField(max_length=200)
    dateOfJoin=models.TextField()

现在我想更改 dateOfJoin = models.DateField()。如何使用 sql 控制台命令将 TextField 更改为 DateField 而不会删除表?

【问题讨论】:

有人请回答 Django 版本 > 1.7 吗? 【参考方案1】:

您需要的应​​用是South 以下是步骤(有关详细信息,请参阅文档):

./manage.py convert_to_south yourapp 

这将创建一个迁移文件夹并伪造第一个迁移

然后在你的 models.py 中添加一个new_dateOfJoin DateField :

./manage.py migrate yourapp 

这将立即创建并应用迁移(名为 0002_...)以在 db 中添加此字段

创建一个datamigration 0003 file,您只需将文本值转换为日期并将其保存在新字段中 然后应用此迁移:

./manage.py migrate yourapp

修改您的 models.py 文件以注释掉旧的日期字段并再次迁移(这将创建 0004_.... 迁移文件)

最后一步是重命名 db 字段,这样您就不必修改现有代码:

./manage.py schemamigration yourapp rename_dateofjoin --empty

这将创建一个名为0005_rename_dateofjoin的空架构迁移文件 像 here 解释的那样手动修改这个 0005 文件,但是像 this other example 那样使用 db.rename_column('app_foo', 'name', 'full_name')

删除整个表格而不是这 5 个步骤可能会更容易,但如果您有多个应用实例(例如工作的生产服务器和开发机器),则需要此类工具。 如果对 South 有更好的了解,也可以在不到 5 个步骤内完成此操作,但由于迁移有时难以撤消或重现,因此我更喜欢有不同的步骤...

【讨论】:

不客气。如果它回答了您的问题,请单击我的答案旁边的“复选”标记,以便关闭问题。 谢谢,非常有用的演练!【参考方案2】:

South project 通常用于迁移架构和数据。我不确定它是否可以用于将文本字段转换为日期字段,但如果可以的话我不会感到惊讶。

【讨论】:

【参考方案3】:

我让它以另一种方式工作。我通过 sql 控制台选择了我的数据库,并使用 sql 查询添加了新列。效果很好:),非常感谢你们提供的帮助..

【讨论】:

以上是关于在不删除表的情况下更改模型中的 Django 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系

hbase - 如何在不删除表的情况下更改表结构

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库

如何在不删除或移动mysql中的表的情况下重命名数据库? [复制]

如何在不删除数据库的情况下删除 phpMyAdmin 中数据库中所有表的内容?

如何在不重绘图表的情况下刷新 jqplot 条形图