Django 1.8迁移 - CircularDependencyError

Den*_*nny 3 python django django-models django-migrations

我有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
Run Code Online (Sandbox Code Playgroud)

在我的设置文件中,我将AUTH_USER_MODEL定义为:AUTH_USER_MODEL = 'authtools.User'.创建的迁移文件如下所示:对于authtools应用程序,它将依赖关系显示为:

dependencies = [
        ('main', '__first__'),
        ('auth', '0001_initial'),
    ]
Run Code Online (Sandbox Code Playgroud)

而对于主要应用程序,depandancies显示为:

dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]
Run Code Online (Sandbox Code Playgroud)

可能有什么不对?

Tit*_*ter 7

如果您对不同的应用程序使用ManyToMany +'through'选项,则根据此答案,您应该:

  1. 通过在行的开头添加#,在整行中注释您使用ManyToMany +
  2. makemigrations of_all_apps_you_need(也是p1行存在的那个)
  3. 从p1取消注释该行
  4. makemigrations the_app_where_the_line_from_p1_exist
  5. 迁移

如果你不使用ManyToMany,那么根据这个答案,尝试类似的动作.

让我们假设您要创建这些模型:

libros/models.py:

class Libro(models.Model):
    name = models.CharField(max_length=20)
    perfile = models.ForeignKey('perfiles.Perfile', null=True)
Run Code Online (Sandbox Code Playgroud)

perfiles/models.py:

class Perfile(models.Model):
    name = models.CharField(max_length=20)
    libro = models.ForeignKey('libros.Libro', null=True)
Run Code Online (Sandbox Code Playgroud)

当然,由于循环依赖,你不能这样做.因此,在Libro模型中注释掉外键:

class Libro(models.Model):
    name = models.CharField(max_length=20)
    # perfile = models.ForeignKey('perfiles.Perfile', null=True)
Run Code Online (Sandbox Code Playgroud)

并运行两次迁移:

python manage.py makemigrations libros
python manage.py makemigrations perfiles
Run Code Online (Sandbox Code Playgroud)

之后取消注释模型中的perfile外键Libro并运行另一个迁移:

python manage.py makemigrations libros
Run Code Online (Sandbox Code Playgroud)