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

时间:2019-11-30 11:56:13

标签: python django

我之前遇到的所有答案都不明确或不明确。

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

问题是第三方程序包使用Interger字段来引用用户(基于该应用程序使用默认django用户的假设),但在我的情况下,我使用uuid作为用户ID

package 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而不是整数字段。

PS:我曾尝试在我的用户应用中创建一个空迁移,并编写了迁移,但没有成功。

2 个答案:

答案 0 :(得分:1)

不知道这是否行得通,您可以将用户模型的ID设置为与此应用程序配合使用的对象。然后制作一个依赖于其他应用程序的上一次迁移的迁移文件,然后将模型和外键转换为您想要的任何文件。

答案 1 :(得分:1)

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

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

我将puput的所有迁移文件都复制到自己的一个应用程序的目录中(对于我来说,该应用程序是app/custom_puput_migrations,并根据需要进行了编辑。

然后在settings中输入:

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

然后我从头开始重新创建数据库,然后就消失了。

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

相关问题