我想重构一些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
问题阻止我这样做。
其他人如何使这种代码重构和迁移成为可能?谢谢!
答案 0 :(得分:6)
您是否考虑过使用迁移工具,例如South或django-evolution?
答案 1 :(得分:0)
只需在新模型或旧模型中为ForeignKey提供related_name参数,就可以非常轻松地解决当前问题,正如错误消息所示。没有信心可以解决您在迁移过程中遇到的所有问题,但这会让您向前迈进一步。