将UUID PK迁移到Django的默认PK

时间:2020-08-23 04:13:21

标签: django django-models

我犯了一个错误,并将模型的PK设置为UUID:

id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False)

我想将其还原为Django的默认值,其中每个实例自动具有PK,没有ID模型字段。我怎样才能做到这一点?谢谢!

当我尝试仅删除id字段时进行更新:

  1. 我删除了字段
  2. 我跑了python manage.py makemigrations

哪位给了我

 - Alter field id on organization
  1. 我跑了python manage.py migrate

哪位给了我

LINE 1: ...nization" ALTER COLUMN "id" TYPE integer USING "id"::integer

希望这会有所帮助!

1 个答案:

答案 0 :(得分:0)

由于注释中的解决方案似乎难以遵循,因此这是一个更简单的想法,可能更易于实现:

  • 创建模型和所有模型的副本
  • 遍历原始模型中的所有记录并将其保存到新模型中

class OriginalModel(models.Model):
    id = models.UUIDField(primary_key=True)
    random_field = models.BooleanField()

class FKModel(models.Model):
    fk = models.ForeignKey(OriginalModel)
    my_field = models.BooleanField()

# new model with default `id` column
class NewOriginalModel(models.Model):
    random_field = models.BooleanField()
    
# new model bound by foreign key
class NewFKModel(models.Model):
    fk = models.ForeignKey(NewOriginalModel)
    my_field = models.BooleanField()
    
# load old models and recreate them manually
for old_model in in OriginalModel.objects.all():
   # eventually use django.forms.models.model_to_dict instead
   new_model = NewOriginalModel(random_field=old_model.random_field)
   new_model.save()
   
   # recreate all models bound by foreign keys
   old_fks = FKModel.objects.filter(fk=old_model)
   for old_fk in old_fks:
       new_fk = NewFKModel(my_field=old_fk.my_field, fk=new_model)
       new_fk.save()