【问题标题】:Adding a HASH column to existing table in Django将 HASH 列添加到 Django 中的现有表
【发布时间】:2020-11-12 05:33:56
【问题描述】:

我想在我现有的 django 表中添加一个新的 HASH 列。我推荐了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。我该怎么做?

【问题讨论】:

  • 默认函数=_create_uuid()不用括号吗?

标签: python hash uuid django-migrations


【解决方案1】:

您可以在迁移期间运行 Python 脚本来生成哈希值。首先生成一个默认值为空的迁移文件。然后添加一个 RunPython 函数并更改该字段以将您的 _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),
        ),
    ]

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 2016-11-13
    • 2019-03-24
    • 2023-04-07
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多