Django 1.8迁移 - CircularDependencyError

时间:2015-06-22 13:44:52

标签: 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

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

dependencies = [
        ('main', '__first__'),
        ('auth', '0001_initial'),
    ]

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

dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

可能出现什么问题?

4 个答案:

答案 0 :(得分:6)

如果您对不同的应用程序使用ManyToMany +' 选项,那么您应该使用according to this answer

  1. 通过添加#来评论使用ManyToMany +的整行 在行的开头
  2. makemigrations of_all_apps_you_need(也是来自p1的那一行)
  3. 取消注释来自p1
  4. 的行
  5. makemigrations the_app_where_the_line_from_p1_exist
  6. 迁移
  7. 如果您不使用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。

希望这有助于某人。