在 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),
),
]
我想向我现有的 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),
),
]