Django 1.8迁移 - CircularDependencyError

问题描述 投票:2回答:4

我有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'),
    ]

对于主应用程序,依赖关系显示为:

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

可能有什么不对?

python django django-models django-migrations
4个回答
6
投票

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

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

如果您不使用Many To Many,则根据this answer,尝试类似的操作。

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

books / models.py:

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

profiles / 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
投票

我想你需要遵循这个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      ]

0
投票

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

假设你有两个模型,每个模型都有一个ForeignKey到另一个模型。您无法创建这两个模型和makemigrations。你必须一步一步地应用它们。首先应用一个没有与另一个模型关系的模型,然后是另一个模型(现在,可以保留与第一个模型的关系),然后是第一个模型与第二个模型的关系。思考逻辑。编写一个依赖于另一个而没有第二个模型的模型是不可能的。

但这必须仅针对第一次迁移创建过程(例如,没有任何迁移的新应用程序)来完成。然后,您只需维护和更新模型。


0
投票

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

使用TitanFighter的例子。没有必要转义模型字段,而是先为perfiles创建迁移,然后再迁移libros。

希望这有助于某人。

© www.soinside.com 2019 - 2024. All rights reserved.