Python Django模型重构和迁移

Python Django模型重构和迁移,python,django,django-models,Python,Django,Django Models,我想重构一些django应用程序,将模型从一个应用程序移动到另一个应用程序,以便更容易重用 其中许多模型与其他模型(如用户)具有ForeignKey关系或M2M关系。例如: class Department(models.Model): name = models.CharField(max_length=255) reviewers = models.ManyToManyField(User) 在大多数情况下,模型不会改变,所以我目前只是在新的应用程序中重新定义了它们。这当然

我想重构一些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\u name
问题阻止了我这样做


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

您看过使用迁移工具(如或)吗?

您可以非常轻松地解决眼前的问题,只需在新的或旧的模型中为ForeignKey提供一个相关的\u name参数,就像错误消息告诉您的那样。我不相信这会解决您在这次迁移中遇到的所有问题,但这会让您向前迈进一步。

我知道south,但我认为它只是修改了表模式(而不是数据)。它也传输数据吗?是的,South有一个非常好的系统来进行数据迁移,包括“冻结”旧版本的模型,以便在实际模型看起来不同之后,数据迁移将继续工作。在阅读了South教程(以及更多内容)之后,我认为这肯定是一种方法。谢谢你。你的评论:South确实进行数据迁移,我实际上有3个不同应用程序的几个(可能大约10个)模型,我想把它们全部拉到一个共享应用程序中。。。我想我可以为旧模型设置临时的相关名称,进行迁移,然后删除旧模型。我假设这将允许我保留所有其他代码不变。是的,如果您将相关的_名称添加到旧模型的ForeignKey,则不需要更改任何代码。其他东西会暂时中断,因为新表中不会有任何数据,但您会很快修复它。