当前位置: 首页 > 面试题库 >

使用Django / South重命名模型的最简单方法?

路阳华
2023-03-14
问题内容

我一直在South的网站,Google和SO上寻找答案,但是找不到简单的方法来做到这一点。

我想使用South重命名Django模型。说你有以下几点:

class Foo(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Foo)

并且你想要将Foo转换为Bar,即

class Bar(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Bar)

为简单起见,我只是尝试将名称从更改FooBar,但现在忽略其中的foo成员FooTwo

使用South进行此操作最简单的方法是什么?

  1. 我可能可以进行数据迁移,但这似乎很复杂。
  2. 编写一个自定义迁移,例如db.rename_table('city_citystate', 'geo_citystate'),但是在这种情况下我不确定如何修复外键。
  3. 你知道一种更简单的方法吗?

问题答案:

为了回答你的第一个问题,简单的模型/表重命名非常简单。运行命令:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(更新2:尝试--auto,而不是--empty避免低于警告感谢@KFB的提示。)

如果你使用的是南方的旧版本,则需要startmigration而不是schemamigration

然后手动编辑迁移文件,如下所示:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_table('yourapp_foo', 'yourapp_bar')


    def backwards(self, orm):
        db.rename_table('yourapp_bar','yourapp_foo')   

你可以使用db_table模型类中的Meta选项来更简单地完成此操作。但是每次这样做,都增加了代码库的旧版权重-类名与表名不同会使代码难以理解和维护。为了清楚起见,我完全支持执行这样的简单重构。

(更新)我刚刚在生产环境中尝试过此操作,并在应用迁移时收到一个奇怪的警告。它说:

The following content types are stale and need to be deleted:

    yourapp | foo

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

我回答“不”,一切似乎都很好。



 类似资料:
  • 问题内容: 我想更改模型中特定字段的名称: 应更改为: 使用South进行此操作最简单的方法是什么? 问题答案: 你可以使用该功能。 的第一个参数是表名,因此记住如何创建表名很重要: Django自动从你的模型类和包含它的应用程序的名称中派生数据库表的名称。通过将模型的“应用程序标签”(即你在manage.py startapp中使用的名称)与模型的类名称连接在一起,并在其之间加下划线,来构造模型

  • 问题内容: 我在想,如果以下迁移是可能的Django的南部和仍然保留的数据。 之前: 我目前有两个应用程序,一个叫做电视,一个叫做电影,每个都有一个VideoFile模型(在这里简化): tv/models.py: movies/models.py: 后: 因为这两个videofile对象是如此相似,所以我想摆脱重复并在一个名为media的单独应用中创建一个新模型,其中包含通用的VideoFile

  • 问题内容: 如何在Django上使用South执行向后迁移? 因此,我调整了模型,使用进行了迁移schemamigration,使用进行了迁移migrate,现在我意识到这并不是我想要的,并且我想回到以前的样子。 除了手动编辑数据库表和删除迁移文件之外,我应该如何回滚迁移?我找到了通过Google通过South使用向后迁移的参考,但尚未找到可靠的代码示例。 有人可以帮忙吗? 问题答案: 你需要在要

  • 本文向大家介绍Django框架模型简单介绍与使用分析,包括了Django框架模型简单介绍与使用分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Django框架模型简单介绍与使用。分享给大家供大家参考,具体如下: ORM介绍 ORM Object relational mapping 对象关系映射 把面向对象中的类和数据库表一一对应起来,通过操作类和对象,对数据库表实现数据的增删改查等操

  • 问题内容: 我已经积累了许多使用South(0.7)和Django(1.1.2)进行的迁移,这些迁移在我的单元测试中开始占用大量时间。我想重置基准并开始新的迁移。我已经阅读了South文档,进行了常规的Google / Stackoverflow搜索(例如“ django south(重置或删除或删除)迁移历史记录”),但没有发现任何明显的内容。 我考虑过的一种方法是通过手动“删除” South或

  • 本文向大家介绍在Django的URLconf中使用命名组的方法,包括了在Django的URLconf中使用命名组的方法的使用技巧和注意事项,需要的朋友参考一下 在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。 在更高级的用法中,还可以使用 命名 正则表达式组来捕获URL,并且将其作为关键字参数传给视图。 一个 Python 函数可以使用关键字参数或位