Skip to content

Instantly share code, notes, and snippets.

@smcoll
Last active January 24, 2024 15:55
Show Gist options
  • Star 42 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save smcoll/8bb867dc631433c01fd0 to your computer and use it in GitHub Desktop.
Save smcoll/8bb867dc631433c01fd0 to your computer and use it in GitHub Desktop.
Django migration converting integer pk table to UUID pk table
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uuid
from django.db import migrations, models
def fill_mymodel_uuid(apps, schema_editor):
db_alias = schema_editor.connection.alias
MyModel = apps.get_model('myapp', 'MyModel')
for obj in MyModel.objects.using(db_alias).all():
obj.uuid = uuid.uuid4()
obj.save()
class Migration(migrations.Migration):
""" Change model with integer pk to UUID pk. This migration presumes there
are no db constraints (foreign keys) to this table.
"""
dependencies = [
# ...
]
operations = [
migrations.AddField(
model_name='mymodel',
name='uuid',
field=models.UUIDField(null=True),
),
migrations.RunPython(fill_mymodel_uuid, migrations.RunPython.noop),
migrations.AlterField(
model_name='mymodel',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, serialize=False, editable=False, unique=True),
),
migrations.RemoveField('MyModel', 'id'),
migrations.RenameField(
model_name='mymodel',
old_name='uuid',
new_name='id'
),
migrations.AlterField(
model_name='mymodel',
name='id',
field=models.UUIDField(primary_key=True, default=uuid.uuid4, serialize=False, editable=False),
),
]
@thielena
Copy link

thielena commented May 1, 2022

@sharshub Thanks für this really good help!

Have you or (anyone else here) done it for many2many relations as well? I have no idea how to change the id's in the intermediate tables.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment