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

时间:2011-03-21 04:46:36

标签: python mysql django postgresql django-models

我创建了一个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控制台命令删除表的情况下将TextFieild更改为DateField?

3 个答案:

答案 0 :(得分:18)

您需要的应​​用是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的空模式迁移文件 手动修改此0005文件,如解释here,但使用this other example中的db.rename_column('app_foo', 'name', 'full_name')

删除整个表而不是这5个步骤可能会更容易,但如果您有多个应用实例(如工作生产服务器和开发机器),则需要这种工具。
通过更好地了解南方,人们也可以在不到5个步骤中做到这一点,但由于迁移有时难以撤消或重现,我更愿意采取不同的步骤......

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我让它以另一种方式工作。我通过sql console选择了我的数据库,并添加了带有sql查询的新列。这工作得很好:),非常感谢你们给予的帮助..