Django模型重构与迁移

2 投票
2 回答
2839 浏览
提问于 2025-04-15 14:45

我想对一些Django应用进行重构,具体来说,就是把某些模型从一个应用移动到另一个应用,这样可以更方便地重复使用这些模型。

这些模型中有一些与其他模型(比如用户)有外键关系或多对多关系。例如:

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

你可以很简单地解决眼前的问题,只需要在新模型或旧模型的ForeignKey里加上一个related_name参数,就像错误信息里告诉你的那样。虽然我不能保证这样能解决你所有的迁移问题,但这至少能让你向前迈出一步。

6

你有没有考虑过使用一些迁移工具,比如South或者django-evolution呢?

撰写回答