2015-10-19 2 views
0

Я добавил новое поле uuid в таблицу, user_table, с существующими строками. Из-за состояния гонки я получаю ошибку «Дублировать запись» при переносе. Я последовал шагов здесь: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

UPDATE: Я понял, что у меня было несоответствие имени столбца, оно должно работать сейчас :) row.uuid = uuid.uuid4() должен быть строкой. UUID_loc = uuid.uuid4(); это было глупо со мной – plumSemPy

Смежные вопросы