2015-02-11 55 views
2

我有一個用Django 1.6編寫的項目,使用南遷移,我試圖將它移動到Django 1.7。所以我從here指示開始。從南到Django 1.7遷移:可替換的依賴關係

  1. 刪除southINSTALLED_APPS
  2. 刪除舊的遷移文件。
  3. Ran ./manage.py makemigrations

在這一點上,我得到了django.db.migrations.graph.CircularDependencyError

這裏是我的模型:

customer.models.py

class Customer(models.Model): 
    name = models.CharField(
     max_length=128, 
    ) 

class Department(models.Model): 
    customer = models.ForeignKey(
     'customer.Customer', 
     related_name='departments', 
    ) 
    name = models.CharField(
     max_length=64, 
    ) 

class Representative(models.Model): 
    user = models.ForeignKey(
     'userprofile.User', 
     related_name='representatives', 
    ) 
    department = models.ForeignKey(
     'customer.Department', 
     related_name='representatives', 
    ) 

userprofile.models.py

class User(AbstractBaseUser, PermissionsMixin): 
    customers = models.ManyToManyField(
     'customer.Customer', 
     blank=True, 
     null=True, 
    ) 

,在最初的遷移造成了customer應用可更換的依賴性:

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

至於有人建議here,我編輯初始遷移userprofile和評價與客戶相關的線路:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('auth', '0001_initial'), 
     #('customer', '0001_initial'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='User', 
      fields=[ 
       ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), 
       ('first_name', models.CharField(max_length=128, error_messages={b'min_length': 'El campo "Nombres" debe tener al menos %(limit_value)d caracteres (actualmente tiene %(show_value)d).'}, verbose_name='nombres', validators=[django.core.validators.MinLengthValidator(3)])), 
       ('last_name', models.CharField(max_length=128, error_messages={b'min_length': 'El campo "Apellidos" debe tener al menos %(limit_value)d caracteres (actualmente tiene %(show_value)d).'}, verbose_name='apellidos', validators=[django.core.validators.MinLengthValidator(3)])), 
       ('email', models.EmailField(unique=True, max_length=75, verbose_name='correo electr\xf3nico')), 
       #('customers', models.ManyToManyField(to='customer.Customer', null=True, verbose_name='clientes relacionados', blank=True)), 
      ], 
      bases=(models.Model,), 
     ), 
    ] 

./manage.py migrate並創造了另一個遷移,增加了客戶現場:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('customer', '0001_initial'), 
     ('userprofile', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='user', 
      name='customers', 
      field=models.ManyToManyField(to='customer.Customer', null=True, verbose_name='clientes relacionados', blank=True), 
      preserve_default=True, 
     ), 
    ] 

但是,當我跑./manage.py migrate userprofile --fake,我得到一個錯誤

Running migrations: 
    No migrations to apply. 
    Your models have changes that are not yet reflected in a migration, and so won't be applied. 
    Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them. 

在另一方面,如果沒有這個遷移我的測試失敗:

OperationalError: no such table: userprofile_user_customers 

回答

2

我的錯誤是,而不是運行./manage.py makemigrations userprofile --empty運行./manage.py makemigrations userprofile。在第一種情況下的Django理解它這樣增加了contracts字段(它是)遷移和用於第二情況下,如果我跑./manage.py migrate userprofile與它失敗:

django.db.utils.ProgrammingError: relation "userprofile_user_customers" already exists 

所以我不得不:

  1. 複製上次遷移的內容:

    class Migration(migrations.Migration): 
    
        dependencies = [ 
         ('customer', '0001_initial'), 
         ('userprofile', '0001_initial'), 
        ] 
    
        operations = [ 
         migrations.AddField(
          model_name='user', 
          name='customers', 
          field=models.ManyToManyField(to='customer.Customer', null=True, verbose_name='clientes relacionados', blank=True), 
          preserve_default=True, 
         ), 
        ] 
    
  2. 刪除遷移。

  3. 運行./manage.py makemigrations userprofile --empty
  4. 粘貼並運行./manage.py migrate userprofile --fake