2015-06-22 2 views
2

У меня есть 2 приложения django i.e. main и 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

В документации говорится: взаимосвязи между mmodel в Django могут быть очень сложными, а сбой может привести к миграции, которые не выполняются; _ тогда вам нужно вручную разрешить цикл циклической зависимости, как показано в [документации] (http: // django.readthedocs.org/en/latest/topics/migrations.html) –

ответ

1

Я думаю, вы должны следовать этому билету Джанго базы кода: 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

Если вы использование ManyToMany + 'до' опции для различного применения, чем 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. мигрировать

Если вы не используете 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 
0

Идея с миграциями заключается в том, что вам необходимо спланировать рабочий процесс, который должен выполнять Django при применении ваших моделей.

Предположим, у вас есть две модели, и каждый из них имеет ForeignKey для другого. Вы не можете создать эти две модели и mamemigrations. Вы должны применять их шаг за шагом. Сначала примените одну модель без отношения к другой, затем другую модель (теперь можно сохранить связь с первой), а затем отношение первой модели ко второму. Думайте логично. Невозможно написать модель, которая опирается на другую, не имея второй.

Но это должно быть сделано только для первого процесса создания миграции (например, нового приложения без какой-либо миграции). Затем вы просто поддерживаете и обновляете свои модели.

0

Я столкнулся с той же проблемой и смог ее решить, изменив порядок команды makemigration.

Использование примера TitanFighter. Нет необходимости скрывать поля модели, вместо этого makemigration для перфекционов сначала, а затем миграции для libros.

Надеюсь, это поможет кому-то.