【问题标题】:Django model refactoring and migrationDjango 模型重构和迁移
【发布时间】:2009-10-02 15:20:58
【问题描述】:

我想重构一些 django 应用程序,其中涉及将模型从一个应用程序移动到另一个可以更容易重用的应用程序。

其中许多模型与其他模型(例如用户)具有 ForeignKey 关系或 M2M 关系。例如:

class Department(models.Model):
    name = models.CharField(max_length=255)
    reviewers = models.ManyToManyField(User)

在大多数情况下,模型不会改变,所以我目前只是在新应用中重新定义了它们。这当然会导致相关名称出现问题,因为我在两个单独的应用程序中定义了相同的模型,并且manage.py syncdb 给出了以下错误:

new_app.department: Accessor for m2m field 'reviewers' clashes with related m2m field 'User.department_set'. Add a related_name argument to the definition for 'reviewers'.
old_app.department: Accessor for m2m field 'reviewers' clashes with related m2m field 'User.department_set'. Add a related_name argument to the definition for 'reviewers'.

执行此操作时,我还需要迁移保留任何自动生成的数据库 ID 的数据。我计划使用 ORM 进行迁移,认为类似以下的方法会起作用:

from newapp.models import Department
import oldapp.models as old

for obj in old.Department.objects.all():
    new_obj = Department(id=obj.id, name=obj.name)
    new_obj.save()
    for r in obj.reviewers.all():
        new_obj.reviewers.add(r)
    new_obj.save()

当然,related_name 问题阻止了我这样做。

其他人如何使这种代码重构和迁移成为可能?谢谢!

【问题讨论】:

标签: python django django-models


【解决方案1】:

您是否考虑过使用诸如Southdjango-evolution 之类的迁移工具?

【讨论】:

  • 我知道南,但认为它只是修改了表模式(而不是数据)。它也传输数据吗?
  • 是的,South 有一个非常好的数据迁移系统,包括“冻结”旧版本的模型,以便在实际模型看起来不同之后,数据迁移甚至可以继续工作。
  • 在阅读了南方教程(以及更多内容)之后,我认为这绝对是要走的路。谢谢。
【解决方案2】:

您可以非常轻松地解决当前问题,只需在新模型或旧模型中为 ForeignKey 提供一个 related_name 参数,就像错误消息告诉您的那样。不确定这会解决您在迁移过程中遇到的所有问题,但它会让您向前迈出一步。

【讨论】:

  • 我实际上有几个(可能大约 10 个)来自 3 个不同应用程序的模型,我想将它们全部拉入 1 个共享应用程序...我想我可以为旧模型设置临时相关名称,进行迁移,然后删除旧模型。我假设这可以让我保持所有其他代码不变。
  • 是的,如果您将related_name 添加到旧模型的ForeignKey,则不需要更改任何代码。其他事情会暂时中断,因为新表中不会有任何数据,但您会很快解决这个问题。
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 2018-02-20
  • 2020-09-10
  • 2022-06-17
  • 2012-02-23
  • 2015-07-27
  • 2016-02-10
  • 2013-06-28
相关资源
最近更新 更多