在不删除表的情况下更改模型中的 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 个模型之间的多对多关系
如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库
如何在不删除或移动mysql中的表的情况下重命名数据库? [复制]