2015-06-22 50 views
2

我有2个django应用程序,即主要和authtools。当我运行Django 1.8 migrations - CircularDependencyError

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

的文件说:在Django _model相互依赖性可能会非常复杂,挤压可能会导致不运行迁移; _,那么你必须手动解决循环依赖环路像[文件](HTTP暴露:// django.readthedocs.org/en/latest/topics/migrations.html) –

回答

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  ] 
5

如果您使用多对多+ '到'选择不同的应用,比according to this answer你应该:

  1. 评论在您使用多对多+通过把# 在该行
  2. makemigrations of_all_apps_you_need(也是一种来自P1线存在)
  3. 取消注释从P1
  4. makemigrations行的开头一整行the_app_where_the_line_from_p1_exist
  5. 迁移

如果不使用多对多,不是根据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 

Libro模式,取消对perfile外键后并运行另一个迁移:

python manage.py makemigrations libros 
0

迁移的想法是你必须规划Django在应用模型时需要遵循的工作流程。

比方说,你有两个模型,每个模型都有一个ForeignKey到另一个。您无法创建这两个模型并进行迁移。你必须逐步应用它们。首先应用一个模型而不与另一个建立关系,然后使用另一个模型(现在可以保留与第一个模型的关系),然后使用第一个模型与第二个模型的关系。逻辑思考。编写一个依赖另一个而不需要第二个模型的模型是不可能的。

但这必须做只是为了第一迁移创建过程(例如没有任何迁移新的应用程序)。然后你只需维护和更新你的模型。

0

我遇到了同样的问题,并能够通过交换makemigration命令的顺序来解决它。

使用TitanFighter的例子。不需要转义模型字段,而是先迁移perfiles,然后迁移到libros。

希望这可以帮助别人。