如何在Django中更改模型?

时间:2011-07-02 18:03:45

标签: django orm django-models versioning

Django如何处理模型的更改?或者,它为我提供了什么帮助呢?

我正在考虑一种情况,即我已经向我的数据库发布了数据,我不想丢失,但我需要对我的数据模型进行更改 - 例如,向特定类添加额外的字段,更改字段类型等。我的理解是syncdb不会改变数据库中已存在的表。

例如,假设我有以下模型:

class Person(models.Model):
    name = models.CharField(max_length=200)
    phone_number=models.CharField(max_length=200)
    hair_colour=CharField(max_length=50)

我可能想要对我的人做的事情:

  1. 我希望添加一个'age'字段。
  2. 我意识到我想使用IntegerField代替CharField phone_number(无论这是否是一个好主意,是否超出范围......) - 假设它是可能的。
  3. 我意识到我不再希望在Person中定义hair_colour'内联',因为有几个人共享相同的头发颜色 - 我希望将其更改为其他模型的外键。
  4. 虽然我可以想象,如果我所做的只是更新models.py,框架很难/不可能“猜测”我的数据需要做什么,我可以想象可能还会有一些工具帮助启用它 - 它存在吗?

    特别是我认为选项1必须有一些好的模式。

    我对Django很新,没有任何其他ORM类型的经验,我认为这是 - 我一直对ORM有点怀疑,主要是出于上述原因:)

2 个答案:

答案 0 :(得分:3)

Django本身不会尝试修改已创建的数据库表。您尝试做的通常称为“迁移”,Django有几种不同的数据库迁移工具。

South

  • 架构迁移
  • 数据迁移
  • 向后迁移

Nash Vegas

  • 架构迁移
  • 数据迁移

Django Evolution

  • 架构迁移
  • 数据迁移(未知)
  • 向后迁移(未知)

三个南方可能是使用最广泛的,但它们各自有不同的方式来处理迁移。您可以在Django Packages上查看有关比较的更多详细信息。

答案 1 :(得分:1)

您所询问的大部分内容都可以通过django项目South来完成。您将其添加为INSTALLED_APP。创建一个基线,然后在模型更改时创建SQL语句,将表和表中的行转换为新的模型格式。