我想知道是否可以采用现有模型并将默认的id = AutoField
更改为id = UUIDField
。
我尝试过injecting the UUIDField through migrations,但遇到了一些问题。它不喜欢将id从int更改为uuid,每当我执行makemigrations
时,它都会删除密钥,因为模型反映的是不同的,因此将其删除。这已经是很多猴子补丁了,如果事情做得不好,很容易就可以自行破坏。
迁移示例:
def gen_uuid(apps, schema_editor):
MyModel = apps.get_model(APP_NAME, MODEL_NAME)
for row in MyModel.objects.all():
row.uuid = uuid.uuid4()
row.save(update_fields=['uuid'])
# https://stackoverflow.com/a/29587968/1294405
class Migration(migrations.Migration):
def __init__(self, name, app_label):
super(Migration, self).__init__(name, APP_NAME)
replaces = ((APP_NAME, __module__.rsplit('.', 1)[-1]),)
dependencies = [
('APP_NAME', '0004_auto_20190222_1551'),
]
operations = [
migrations.AddField(
model_name=MODEL_NAME,
name='uuid',
field=models.UUIDField(blank=True, null=True),
),
migrations.RunPython(gen_uuid),
migrations.AlterField(
model_name=MODEL_NAME,
name='uuid',
field=models.UUIDField(unique=True)
)
]
我尝试了几种不同的继承方式,以期使其正常运行。在大多数情况下,它几乎可以工作,除非有时间与自定义管理器一起工作。内部的大多数方法都处理其模型,而不是我制作的包装器。
包装示例:
class MyModel(3rdPartyModel):
uuid = models.UUIDField(
primary_key=True, default=uuid.uuid4, editable=False)
这种方法使我学得最远。
我不确定还有什么其他选择可以简单地覆盖另一个模型的字段以使用UUID。如果有某种方式可以轻松替换模型的主键字段。
然后归结为,如果这不是真的不可能,我是否不可避免地需要拉第三方项目并自己在本地进行修改?我不反对。
编辑:
我确实研究了django-swappable-models,但是无法正常工作。不确定这是否有帮助。