gpt4 book ai didi

python - 使用Django South从具体继承走向抽象继承

转载 作者:太空狗 更新时间:2023-10-29 18:31:50 24 4
gpt4 key购买 nike

我有一个现有的 Django 项目,它有几个使用基类具体继承的模型。经过仔细考虑,并阅读了 Jacob Kaplan-Moss 喜欢什么人之后 have to say about it ,在我的例子中不需要使用这种具体的继承。我想改用抽象基类。

让事情变得复杂的是我的网站是实时的并且我有用户输入的数据。因此,我需要在整个过渡期间保持所有数据完好无损。

我举一个更具体的例子:

之前:

app1/models.py:

class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)

app2/models.py:

class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)

base_app/models.py:

class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)

之后:

app1/models.py:

class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)

app2/models.py:

class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)

base_app/models.py:

class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)

class Meta:
abstract = True

现在,我的计划是首先将 abstract = True 添加到 BaseModel。然后,对于使用 BaseModel 的每个模型,一次一个:

  • 使用 south 迁移数据库并使用 --auto 标志创建此迁移
  • 使用南方数据迁移。例如,我将遍历 Model1 中的每个对象以获取 BaseModel 中具有相同 pk 的对象,并将 BaseModel 对象的每个字段的值复制到 Model1 对象。

那么首先,这行得通吗?其次,是否有更好的方法来做到这一点?

更新:

这里详细描述了我的最终解决方案:

http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/

最佳答案

  1. 添加 NewBaseModel,我们使用不同的名称,因此它不会与当前的非抽象名称冲突(否则 South 实际上会删除 BaseModel)。

    class NewBaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

    class Meta:
    abstract = True
  2. 设置Model1和Model2继承NewBaseModel

  3. 运行 schemamigration --auto,Model1 和 Model2 将添加 2 个新字段
  4. 运行 datamigration --empty 并根据 BaseModel 中的值填充新字段
  5. 加载生产数据库并仔细检查所有已正确迁移的内容
  6. 删除 BaseModel 并将 NewBaseModel 重命名为 BaseModel
  7. 运行 schemamigration --auto(这应该 工作;))
  8. 部署!

注意:迁移时使用 orm 变量以使用模型架构的当前状态。

关于python - 使用Django South从具体继承走向抽象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7108899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com