在 Django 中向现有 table 添加哈希列

Adding a HASH column to existing table in Django

我想向我现有的 django 添加一个新的 HASH 列 table。我提到了 How to generate HASH for Django model。这是我的做法:

def _create_uuid():
    return uuid.uuid4().hex[:20]
    
class users(models.Model):
    user_id = models.CharField(max_length=100, primary_key=True)
    uuid= models.CharField(max_length=20, null=False, default=_create_uuid)

虽然这对于添加 uuid 列后创建的所有新用户来说完全正常。但是当我迁移时,所有现有用户都在 uuid 列中分配了相同的 uuid。我希望现有用户也拥有唯一的 uuid。我该怎么做?

您可以在迁移过程中运行 Python 脚本来生成散列。首先生成一个默认值为空的迁移文件。然后添加 运行Python 函数并更改字段以使用 _create_uuid 默认函数获取新值。 迁移脚本可能如下所示:

from django.db import migrations, models
import YOURPROJECT.YOURAPP.models
import uuid

def generate_hash(apps, schema_editor):
    User = apps.get_model("YOURAPP", "users")
    users = User.objects.all()
    for u in users:
        u.uuid = uuid.uuid4().hex[:20]
        u.save()

def reverse_generate_hash(apps, schema_editor):
    pass


class Migration(migrations.Migration):

    dependencies = [
        ('YOUTAPP', 'PREVIOUS_MIGRATIONS_FILE'),
    ]

    operations = [
        migrations.AddField(
            model_name='users',
            name='uuid',
            field=models.CharField(default='', max_length=20),
        ),
        migrations.RunPython(generate_hash, reverse_generate_hash),
        migrations.AlterField(
            model_name='users',
            name='uuid',
            field=models.CharField(default=jYOURPROJECT.YOURAPP.models._create_uuid, max_length=20),
        ),
    ]