如何覆盖第三方 django 包的迁移



我之前遇到的所有答案都不清楚或陈旧。

我安装了第三方软件包并运行了迁移。

问题是第三方软件包使用 Interger 字段来引用用户(基于应用程序使用默认 django 用户的假设(,但就我而言,我使用的是 uuid 作为用户 ID

套餐 models.py

class UserDashboardModule(models.Model):
title = models.CharField(verbose_name=_('Title'), max_length=255)
user = models.PositiveIntegerField(verbose_name=_('user'))
column = models.PositiveIntegerField(verbose_name=_('column'))
order = models.IntegerField(verbose_name=_('order'))
collapsed = models.BooleanField(verbose_name=_('collapsed'), default=False)
...
# Migrations of third-party package
operations = [
migrations.CreateModel(
name='UserDashboardModule',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('title', models.CharField(verbose_name='Title', max_length=255)),
('module', models.CharField(verbose_name='module', max_length=255)),
('app_label', models.CharField(verbose_name='application name', max_length=255, blank=True, null=True)),
('user', models.PositiveIntegerField(verbose_name='user')),
]
),
]

我的用户模型是这样的

class User(AbstractUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
...

此设置使得无法使用第三方软件包,我想在用户表上维护我的 uuid。

我想做的是以某种方式覆盖此迁移并将用户字段转换为 uuid 而不是 interger 字段。

PS:我尝试在我的用户应用程序中创建一个空的迁移并编写了迁移,但它不起作用。

不知道这是否有效,您可以将用户模型的ID设置为此应用程序可以使用的任何内容。 然后创建一个依赖于其他应用程序的上次迁移的迁移文件,然后将您的模型和外键转换为您想要的任何内容。

这可以通过 django 的MIGRATION_MODULES设置来完成。

例如,我需要覆盖puput应用程序中的迁移,原因与您的非常相似(他们硬编码了应该是可交换依赖模型的名称(。

我将puput的所有迁移文件复制到我自己的一个应用程序中的目录中,在我的情况下app/custom_puput_migrations并按照我认为合适的方式对其进行编辑。

然后在settings中我说:

MIGRATION_MODULES = {'puput': 'app.custom_puput_migrations')

然后我从头开始重新创建了我的数据库,然后它就走了。

这样做的缺点是您必须维护这些迁移;每次升级第三方应用程序版本时,您都需要检查并复制他们可能进行的任何迁移。

最新更新