【发布时间】:2012-05-15 19:59:39
【问题描述】:
我想知道最简单的方法:
我有一个名为 Student 的模型,数据库中有许多 Student,具有许多属性,例如:
名称类型
id int(11)
名称 varchar(200)
sex varchar(1)
状态 int(11)
创建日期时间
我想要做的是将模型重命名为 Costumer 并使“状态”字段成为 Charfield (varchar) 而不是整数。而且我必须保持数据库中的数据完好无损。
【问题讨论】:
我想知道最简单的方法:
我有一个名为 Student 的模型,数据库中有许多 Student,具有许多属性,例如:
名称类型
id int(11)
名称 varchar(200)
sex varchar(1)
状态 int(11)
创建日期时间
我想要做的是将模型重命名为 Costumer 并使“状态”字段成为 Charfield (varchar) 而不是整数。而且我必须保持数据库中的数据完好无损。
【问题讨论】:
向SOUTH 的世界敞开心扉。 South 是 Django 项目的智能模式和数据迁移。
在安装后将“south”放入您的 django 设置 installed_apps 列表中,您希望运行 2 个命令。
应用迁移后,您可以通过运行 python manage.py migrate [my_app_name] --list 检查迁移状态。已应用带有 * 的迁移。
【讨论】:
创建表客户(id int(11),
名称 varchar(200),
性 varchar(1),
状态 varchar(20) 创建日期时间);
插入到客户选择 id,name,sex,cast(status as char), 创建自 学生;
然后当然要编辑您的 django 以匹配。
【讨论】:
如果没有其他模型引用学生,那么您可以这样做:
首先备份您的数据库,确保您可以从中恢复(到另一个不同的数据库)
更新你的 django 模型的 python 代码
让 django 创建新表(为您重命名的模型):
python manage.py syncdb
将旧表中的数据复制到新表中:
echo 'insert into costumer select id, name, sex, cast(status as char), created from student;' | python manage.py dbshell
但是,如果您有其他模型使用外键或多对多关系引用旧表,则上述方法将不起作用,因为这些其他模型可能在其数据库模式中引用了旧表。如果这是你的情况,那么你可以试试这个:
将所有模型转储到 json
python manage.py dumpdata --indent 4 > everything.json
更新您的 django 模型
让 Django 创建新表(为您重命名的模型):
python manage.py syncdb
手动编辑 json 文件,将模式 "model": "yourapp.student" 替换为 "model": "yourapp.costumer"。您可能需要进行其他替换,具体取决于您的模型以及它们之间的关系。
重新加载 json
python manage.py loaddata
对于未来,请查看@mangobug 的答案并开始使用django-south。
【讨论】: