我有2个django应用程序,即主要和authtools。我跑的时候
python manage.py migrate
,我得到一个CircularDependencyError:
raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle))
django.db.migrations.graph.CircularDependencyError: main.0001_initial, authtools.0001_initial
在我的设置文件中,我将AUTH_USER_MODEL定义为:AUTH_USER_MODEL = 'authtools.User'
。创建的迁移文件如下所示:
对于authtools应用程序,它将依赖关系显示为:
dependencies = [
('main', '__first__'),
('auth', '0001_initial'),
]
对于主应用程序,depandancies显示为:
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
可能出现什么问题?
答案 0 :(得分:6)
如果您对不同的应用程序使用ManyToMany +' 39; 选项,那么您应该使用according to this answer:
如果您不使用ManyToMany ,则根据this answer,尝试类似的操作。
让我们假设您要创建这些模型:
<强> libros / models.py 强>:
class Libro(models.Model):
name = models.CharField(max_length=20)
perfile = models.ForeignKey('perfiles.Perfile', null=True)
<强> perfiles / models.py 强>:
class Perfile(models.Model):
name = models.CharField(max_length=20)
libro = models.ForeignKey('libros.Libro', null=True)
当然,由于循环依赖,你无法做到这一点。因此,在Libro
模型中注释掉外键:
class Libro(models.Model):
name = models.CharField(max_length=20)
# perfile = models.ForeignKey('perfiles.Perfile', null=True)
并进行两次迁移:
python manage.py makemigrations libros
python manage.py makemigrations perfiles
之后取消注释perfile
模型中的Libro
外键并运行另一次迁移:
python manage.py makemigrations libros
答案 1 :(得分:1)
我认为你需要关注这张django代码库的票:https://code.djangoproject.com/ticket/22932
根据他们的说法,您的迁移代码应该是这样的(https://code.djangoproject.com/attachment/ticket/22932/team.0001_initial.py.diff)或(https://code.djangoproject.com/attachment/ticket/22932/team.0002_auto_20140704_1453.py):
# -*- coding: utf-8 -*-
2 from __future__ import unicode_literals
3
4 from django.db import models, migrations
5 from django.conf import settings
6
7
8 class Migration(migrations.Migration):
9
10 dependencies = [
11 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 ('team', '0001_initial'),
13 ]
14
15 operations = [
16 migrations.CreateModel(
17 name='TeamCaptain',
18 fields=[
19 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
20 ('rider', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
21 ('team', models.ForeignKey(to='team.Team')),
22 ],
23 options={
24 },
25 bases=(models.Model,),
26 ),
27 ]
答案 2 :(得分:0)
迁移的想法是,您必须规划Django在应用模型时需要遵循的工作流程。
假设您有两个模型,每个模型都有一个ForeignKey到另一个模型。您无法创建这两个模型和makemigrations。你必须一步一步地应用它们。首先应用一个没有与另一个模型关系的模型,然后是另一个模型(现在,可以保留与第一个模型的关系),然后是第一个模型与第二个模型的关系。思考逻辑。编写一个依赖于另一个而没有第二个模型的模型是不可能的。
但是,这必须仅针对第一次迁移创建过程(例如,没有任何迁移的新应用程序)来完成。然后,您只需维护和更新模型。
答案 3 :(得分:0)
我遇到了同样的问题,并且能够通过交换makemigration命令的顺序来解决它。
使用TitanFighter的例子。没有必要转义模型字段,而是首先移植导线,然后移植到libros。
希望这有助于某人。