Django模型重构和迁移

时间:2009-10-02 15:20:58

标签: python django django-models

我想重构一些django应用程序,其方式是将模型从一个应用程序移动到另一个应用程序,以便更容易重用。

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

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

在大多数情况下,模型不会更改,因此我目前只是在新应用中重新定义它们。这当然会导致related_name出现问题,因为我在两个独立的应用程序中定义了相同的模型,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问题阻止我这样做。

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

2 个答案:

答案 0 :(得分:6)

您是否考虑过使用迁移工具,例如Southdjango-evolution

答案 1 :(得分:0)

只需在新模型或旧模型中为ForeignKey提供related_name参数,就可以非常轻松地解决当前问题,正如错误消息所示。没有信心可以解决您在迁移过程中遇到的所有问题,但这会让您向前迈进一步。