Django - добавление необходимого автоматически генерируемого `uuid4` в существующий проект

I'm trying to add internal_code to a Django Model in the existing project.

internal_code = models.CharField(max_length=128, default=uuid.uuid4, unique=True)

The problem is that when running migrate, Django raises IntegrityError:

DETAIL:  Key (internal_code)=(b24f1ca6-bd90-4c91-87b0-5f246a4057e1) is duplicated.

Я понимаю, что эта проблема существует только во время migrate, поскольку он генерируется только один раз.

Есть ли способ избежать такого поведения, не прибегая к этому?:

  1. set field to null=True
  2. migrate
  3. add RunPython that will populate all the existing objects internal_code fields
  4. set field to null=False

EDIT: This is the final migration file. I want to know if I can avoid writing such migration to get the same result (automatic so not touching shell)

from django.db import migrations, models
import uuid

def gen_uuid(apps, schema_editor):
    Product = apps.get_model('products', 'Product')
    for product in Product.objects.all():
        product.my_sku = uuid.uuid4()
        product.save(update_fields=['my_sku'])


class Migration(migrations.Migration):

    dependencies = [
        ('products', '0015_auto_20210827_1252'),
    ]

    operations = [
        migrations.AddField(
            model_name='product',
            name='my_sku',
            field=models.CharField(max_length=128, null=True),
        ),
        migrations.RunPython(gen_uuid),
        migrations.AlterField(
            model_name='product',
            name='my_sku',
            field=models.CharField(default=uuid.uuid4, max_length=128, unique=True),
        ),
    ]
Вернуться на верх