django.db.migrations.exceptions.CircularDependencyError

yar*_*ich 3 python django django-database django-migrations

我在空DB上进行django迁移时遇到问题.什么时候,我想迁移我有一个循环依赖错误.ForeignKeys相关的两个应用程序之间的循环依赖性错误

/firstapp/models.py

 class Person(models.Model):
    genders_list = (
        ('m', 'Male'),
        ('f', 'Female'),
    )

    user_field = models.OneToOneField(User, on_delete=models.CASCADE)
    gender = models.CharField(max_length=1, choices=genders_list, default='m')
    phone_1  = models.CharField(max_length=25, verbose_name="Phone number")
    phone_2  = models.CharField(max_length=25, verbose_name="Phone number 2", blank=True)

    def __str__(self):
        return self.user_field.first_name + self.user_field.last_name

class Doctor(Person):
    job_position = models.CharField(max_length=255, verbose_name="Job position")
    hospital_field = models.ForeignKey('hospital.Hospital', on_delete=models.SET_NULL, null=True, default=None,blank = True)
    seat_field = models.ForeignKey('hospital.Seat', on_delete=models.SET_NULL, null=True, default=None,blank = True)

class Patient(Person):
    doctor_field = models.ForeignKey('Doctor', on_delete=models.SET_NULL, null=True, default=None)
Run Code Online (Sandbox Code Playgroud)

/secondapp/models.py

class Hospital(models.Model):
    name = models.CharField(max_length=255, verbose_name="Name")
    description = models.TextField(verbose_name="Description")
    country = models.CharField(max_length=100, verbose_name="Country")
    city = models.CharField(max_length=100, verbose_name="City")
    address = models.CharField(max_length=255, verbose_name="Address")
    post_index = models.CharField(max_length=10, verbose_name="Post index", blank=True)
    main_doctor = models.ForeignKey('authoriz.Doctor', on_delete=models.SET_NULL, null=True,verbose_name="Main Doctor")
    work_phone = models.CharField(max_length=25, verbose_name="Work phone", blank=True)
    phone_1 = models.CharField(max_length=25, verbose_name="Mobile phone 1")
    email = models.EmailField(max_length=100, verbose_name="Email")
    calendar = models.ForeignKey('schedule.Calendar',verbose_name="calendar",null = True)
    def __str__(self):
        return self.name

class Seat(models.Model):
    hospital_field = models.ForeignKey('Hospital', on_delete=models.CASCADE)
    number = models.CharField(max_length=255, verbose_name="Number",unique=True)

    def __str__(self):
        return self.number + '(' + self.hospital_field + ')'
Run Code Online (Sandbox Code Playgroud)

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

追溯

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
    utility.execute()
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/core/management/base.py", line 305, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/core/management/base.py", line 356, in execute
    output = self.handle(*args, **options)
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 136, in handle
    plan = executor.migration_plan(targets)
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/db/migrations/executor.py", line 60, in migration_plan
    for migration in self.loader.graph.forwards_plan(target):
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/db/migrations/graph.py", line 280, in forwards_plan
    self.ensure_not_cyclic(target, lambda x: (parent.key for parent in self.node_map[x].parents))
  File "/home/yarsanich/mydentist/lib/python3.5/site-packages/django/db/migrations/graph.py", line 370, in ensure_not_cyclic
    raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle))
django.db.migrations.exceptions.CircularDependencyError: authoriz.0001_initial, hospital.0001_initial
Run Code Online (Sandbox Code Playgroud)

感谢帮助.

Ala*_*air 6

暂时注释掉外键以打破循环依赖.看起来你可以通过评论来做到这一点Hospital.doctor.删除现有迁移并运行makemigrations以重新创建它们.

最后,取消注释外键,然后makemigrations再次运行.您最终应该没有任何循环依赖项的迁移.