2015-10-19 21 views
0

我用現有的行在我的表user_table中添加了一個新的uuid字段。由於競爭條件,我在遷移時收到「重複輸入」錯誤。然後我遵循的步驟在這裏:Django:在uuid4中重複輸入

http://django.readthedocs.org/en/latest/howto/writing-migrations.html

現在我的第一和第二遷移運行,但我最後的遷徙給了我同樣的錯誤。是我的每個鏈接3遷移如下:

遷移 '0009_label'

from __future__ import unicode_literals 

from django.db import models, migrations 
import uuid 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('app', '0008_label'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='user_table', 
      name='UUID_loc', 
      field=models.UUIDField(default=uuid.uuid4, null=True), 
     ), 
     migrations.AlterField(
      model_name='another_table', 
      name='Time', 
      field=models.CharField(default=0, max_length=3), 
     ), 
    ] 

遷移 '0010_label'

from __future__ import unicode_literals 

from django.db import migrations, models 
import uuid 

def gen_uuid(apps, schema_editor): 
    MyModel = apps.get_model('app', 'user_table') 
    for row in MyModel.objects.all(): 
     row.uuid = uuid.uuid4() 
     row.save() 

class Migration(migrations.Migration): 

    dependencies = [ 
     ('app', '0009_label'), 
    ] 

    operations = [ 
     # omit reverse_code=... if you don't want the migration to be reversible. 
     migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop), 
    ] 

遷移 '0011_label'

from __future__ import unicode_literals 

from django.db import models, migrations 
import uuid 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('app', '0010_label'), 
    ] 

    operations = [ 
     migrations.AlterField(
      model_name='user_table', 
      name='UUID_loc', 
      field=models.UUIDField(default=uuid.uuid4, unique=True), 
     ), 

    ] 

的聯繫是與我非常相關,但不幸的是我得到了同樣的錯誤。現在我陷入了這裏,我的表中有UUID_loc字段,但它還不是唯一的,即第三個遷移尚未運行。任何人都可以提供一些見解嗎?謝謝。

回答

0

我認爲你應該稍微編輯你的第二個遷移,以防止django用重複的uuid值更新你的模型。

def gen_uuid(apps, schema_editor): 
    MyModel = apps.get_model('app', 'user_table') 
    for row in MyModel.objects.all(): 
     while True: 
      row.uuid = uuid.uuid4() 
      if not MyModel.objects.filter(uuid=row.uuid).exists(): 
       break 

     row.save() 

的,你應該再重新運行第二個遷移,然後你應該能夠運行沒有任何問題第三次遷移。

+0

謝謝你的回答,但我仍然得到相同的錯誤:/ – plumSemPy

+0

更新:我意識到我有一個列名稱的差異,它現在必須工作:) row.uuid = uuid.uuid4()應該是行。 UUID_loc = uuid.uuid4();那對我來說很愚蠢 – plumSemPy