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, поскольку он генерируется только один раз.
Есть ли способ избежать такого поведения, не прибегая к этому?:
- set field to null=True
- migrate
- add RunPythonthat will populate all the existing objectsinternal_codefields
- 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),
        ),
    ]