Django - 如何使用South重命名模型字段?

7 浏览
0 Comments

Django - 如何使用South重命名模型字段?

我想要改变模型中特定字段的名称:\n

class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

\n应该改为:\n

class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

\n使用South,最简单的方式是什么?

0
0 Comments

问题的出现原因:有用户提到,他之前并不知道可以使用db.rename_column来重命名字段,他之前的做法是先通过一个schemamigration添加新的字段,然后创建一个datamigration将数据移动到新的字段中,最后再通过一个schemamigration删除旧的字段。另一个用户也提到了使用schema-data-schema技术的问题,即在重命名字段后,字段或模型的名称可能会发生变化,这可能会导致问题,特别是如果使用规范名称来启用调度器。还有一个用户试过在重命名字段时遇到了名称冲突,他使用了完全相同的外键,但是名称不同,结果没有通过验证,所以不要这样做。

解决方法:有用户提到可以使用db.rename_column来重命名字段,但是需要注意的是,db.rename_column不会自动重命名约束,所以需要手动处理。如果忘记处理,可能会导致迁移工作正常进行,但是可能会导致约束仍然使用旧的字段名称,不清楚这个问题是否只是外观上的问题,或者在将来的迁移中,South是否无法找到这个约束。总之,像sjh建议的那样在这里处理是安全的方式:可以让South自己决定应该做什么。

0
0 Comments

问题的出现的原因:需要在Django的模型中重命名一个字段。

解决方法:

1. 在模型中更改字段的名称。

2. 运行命令./manage.py schemamigration myapp renaming_column_x --auto,生成一个迁移文件myapp/migrations/000x_renaming_column_x.py,该文件将删除旧的列并添加一个新的列。

3. 修改迁移文件中的代码,将迁移行为更改为简单的重命名操作。

以上是解决问题的方法,但是需要注意的是,使用db.rename_column方法进行重命名时,不会重命名与该列相关的约束。如果需要重命名约束,可以使用db.delete_uniquedb.create_unique方法。

0
0 Comments

问题原因:用户想要使用South重命名Django模型中的一个字段,但是他尝试使用db.rename_column('app_foo', 'rel', 'odd_relation')时遇到了错误。

解决方法:用户可以使用db.rename_column函数来重命名字段。该函数的第一个参数是表名,所以重要的是要记住Django如何创建表名。对于多个单词的驼峰命名模型名称,表名将是app_projectitem,即在project和item之间不插入下划线,即使它们是驼峰命名的。

然而,如果在重命名关系字段时遇到错误,可能是因为存在与该列相关的索引(Django生成的unique_together约束)。可以尝试重新声明这个关系字段并使用db.create_unique函数来解决这个问题。

另外,如果手动进行了db.rename_column操作,可能需要进行一个假的schemamigration来清理一些问题。首先使用重命名列的迁移进行迁移,然后修复模型(以更新名称),最后执行./manage.py schemamigration app --auto && ./manage.py migrate app --fake来完成假的迁移。

在DataMigration中,可以使用代码检索与模型对应的数据库表,并在其中重命名列。

总结起来,要使用South重命名Django模型中的字段,可以使用db.rename_column函数,并确保正确使用表名和列名。如果遇到关系字段重命名的问题,可以尝试重新声明关系和使用db.create_unique函数。另外,可能需要进行假的schemamigration来清理问题。

0