2016-03-08 71 views
1

我們的Django使用1.8和我們的項目遷移,我們多次遇到如下問題數據遷移不匹配:的Django與models.py

  1. 我們改變/添加模型遷移1
  2. 我們添加/改變一些數據,以滿足新的邏輯與遷移2
  3. 我們再次改變模型並創建遷移3

現在的開發者之一同步的3個新的遷移和遇到錯誤由於mismatc h在models.py和數據庫之間。

到目前爲止,我們要麼僞造遷移錯誤,要麼我們特別改變依賴關係。但這既不繫統也不方便。

有沒有更好的方法來解決這個問題?

以下是問題是如何產生的一個簡單的例子: 原models.py模型改變之前

class Test(models.Model): 
    a = models.CharField(max_length=200, verbose_name="A") 
    b = models.CharField(max_length=200, verbose_name="B") 

遷移:

0001_initial.py

class Migration(migrations.Migration): 

    dependencies = [ 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Test', 
      fields=[ 
       ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), 
       ('a', models.CharField(max_length=200, verbose_name=b'A')), 
       ('b', models.CharField(max_length=200, verbose_name=b'B')), 
      ], 
     ), 
    ] 

0002_auto_20160308_1103.py

def testData(apps, schema_editor): 
    Test.objects.create(a="aaaa", b="bbb") 
class Migration(migrations.Migration): 

    dependencies = [ 
     ('Test', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(testData) 
    ] 

新models.py

class Test(models.Model): 
    a = models.CharField(max_length=200, verbose_name="A") 
    b = models.CharField(max_length=200, verbose_name="B") 
    c = models.CharField(max_length=200, verbose_name="C", default="c") 

最後遷移:

0003_test_c.py

class Migration(migrations.Migration): 

    dependencies = [ 
     ('Test', '0002_auto_20160308_1103'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='test', 
      name='c', 
      field=models.CharField(default=b'c', max_length=200, verbose_name=b'C'), 
     ), 
    ] 

運行migrate結果django.db.utils.OperationalError: table Test_test has no column named c在運行第二個遷移。

+0

這絕不應該發生;遷移意味着*完全*此用例。這意味着你做錯了什麼。您應該準確解釋當您「由於不匹配而遇到錯誤」時發生的情況。 –

+0

用可重現的示例修正了這個問題 –

回答

3

您沒有使用遷移系統提供的功能。特別是,你直接引用Test模型;但是遷移系統包含了從歷史遷移到動態建立的「歷史模型」的概念,因此可以精確地解決這個問題。

documentation解釋這個進一步,但基本上而不是遷移技術導入測試,你應該動態地獲得它:

def testData(apps, schema_editor): 
    Test = apps.get_model("myapp", "Test") 
    Test.objects.create(a="aaaa", b="bbb") 
+0

謝謝!一如以往,答案是rtfm ...將修改問題,以便其他人更容易找到它。 –

相關問題