django.db.migrations.exceptions.CircularDependencyError
Posted
技术标签:
【中文标题】django.db.migrations.exceptions.CircularDependencyError【英文标题】: 【发布时间】:2017-04-03 23:11:57 【问题描述】:我对空数据库上的 Django 迁移有疑问。当我想迁移时,我遇到了循环依赖错误。外键关联的两个应用之间的循环依赖错误
/firstapp/models.py
class Person(models.Model):
...
class Doctor(Person):
hospital = models.ForeignKey('hospital.Hospital', on_delete=models.SET_NULL, null=True, default=None,blank = True)
...
class Patient(Person):
doctor = models.ForeignKey('Doctor', on_delete=models.SET_NULL, null=True, default=None)
/secondapp/models.py
class Hospital(models.Model):
...
main_doctor = models.ForeignKey('authoriz.Doctor', on_delete=models.SET_NULL, null=True,verbose_name="Main Doctor")
calendar = models.ForeignKey('schedule.Calendar',verbose_name="calendar",null = True)
...
class Seat(models.Model):
hospital = models.ForeignKey('Hospital', on_delete=models.CASCADE)
...
之后
python manage.py migrate
追溯
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/user/project/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
utility.execute()
File "/home/user/project/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/user/project/lib/python3.5/site-packages/django/core/management/base.py", line 305, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/user/project/lib/python3.5/site-packages/django/core/management/base.py", line 356, in execute
output = self.handle(*args, **options)
File "/home/user/project/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 136, in handle
plan = executor.migration_plan(targets)
File "/home/user/project/lib/python3.5/site-packages/django/db/migrations/executor.py", line 60, in migration_plan
for migration in self.loader.graph.forwards_plan(target):
File "/home/user/project/lib/python3.5/site-packages/django/db/migrations/graph.py", line 280, in forwards_plan
self.ensure_not_cyclic(target, lambda x: (parent.key for parent in self.node_map[x].parents))
File "/home/user/project/lib/python3.5/site-packages/django/db/migrations/graph.py", line 370, in ensure_not_cyclic
raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle))
: authoriz.0001_initial, hospital.0001_initial
感谢您的帮助。
【问题讨论】:
【参考方案1】:暂时注释掉外键以打破循环依赖。看起来您可以通过注释掉 Hospital.doctor
来做到这一点。删除现有迁移并运行 makemigrations
重新创建它们。
最后,取消注释外键,然后再次运行makemigrations
。您最终应该得到没有任何循环依赖的迁移。
【讨论】:
我有同样的问题,但在我的例子中,我没有得到循环依赖的模型名称,我只是得到应用程序的名称。我怎么知道哪些模型是循环依赖的? @HugoLuisVillalobosCanto 此处的错误消息也没有命名模型,我必须查看应用程序之间的外键。我们无法在此处的 cmets 中为您提供帮助,因为我们不知道您的模型。 一定有更好的方法吧?为什么除了评论和取消评论没有其他解决方案。 @NickSmith 这个问题已经有好几年了,使用像firstapp
这样的虚构变量,并且不包括失败的迁移,所以它不是尝试解决问题的最佳地点.当我在 Django 3.1 中创建两个具有 fks 的应用程序时,它为其中一个应用程序创建了两个迁移,并避免了迁移中的循环依赖,因此不需要注释掉。
@Alasdair Cool 来看看回复!!我仍然收到错误,我可以发布一个包含我的详细信息的新问题并将链接粘贴到此处吗?【参考方案2】:
如果您添加日历模型,应该会很有用。但是不要使用没有抽象模态的继承。
class Person(models.Model):
...
class Meta:
abstract = True
【讨论】:
感谢您的关注,这对我的情况很有用。【参考方案3】:就像您可能已将它们定义为以下内容:
new_field = models.ForeignKey(ForeignModel, ...)
改为这样做:
new_field = models.ForeignKey("ForeignModel", ...)
【讨论】:
以上是关于django.db.migrations.exceptions.CircularDependencyError的主要内容,如果未能解决你的问题,请参考以下文章