Django模型重构与迁移
我想对一些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呢?