2016-11-20 1 views
0

空のDB上でのdjangoの移行に問題があります。ときに、私は移行したい私は循環依存エラーがあります。django.db.migrations.exceptions.CircularDependencyError

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 + ')' 

python manage.py migrate 

トレースバックした後のForeignKey

/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) 

/secondapp/models.pyによって関連する2つのアプリケーション間の循環依存の誤差

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 

ありがとうございました。

答えて

0

一時的に外部キーをコメントアウトして、循環依存関係を解除します。 Hospital.doctorをコメントアウトすることでこれを行うことができるようです。既存の移行を削除し、makemigrationsを実行して再作成します。

最後に、外部キーのコメントを外し、makemigrationsを再度実行します。循環依存関係のない移行に終わるはずです。

+0

素晴らしい!それはうまく動作します!ありがとう。 – yarsanich

0

カレンダーモデルを追加すると便利です。しかし抽象モーダルなしで継承を使用しないでください。

class Person(models.Model): 
    ... 

    class Meta: 
     abstract = True 
+0

あなたのご関心をお寄せいただき、ありがとうございます。 – yarsanich