我之前遇到的所有答案都不明确或不明确。
我已安装了第三方软件包,并且已运行迁移。
问题是第三方程序包使用Interger字段来引用用户(基于该应用程序使用默认django用户的假设),但在我的情况下,我使用uuid作为用户ID
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:我曾尝试在我的用户应用中创建一个空迁移,并编写了迁移,但没有成功。
答案 0 :(得分:1)
不知道这是否行得通,您可以将用户模型的ID设置为与此应用程序配合使用的对象。然后制作一个依赖于其他应用程序的上一次迁移的迁移文件,然后将模型和外键转换为您想要的任何文件。
答案 1 :(得分:1)
这可以通过Django的MIGRATION_MODULES
设置来完成。
例如,出于与您的原因非常相似的原因(它们用硬编码的方式应该是可交换依赖模型的名称),我需要覆盖puput
应用程序中的迁移。
我将puput的所有迁移文件都复制到自己的一个应用程序的目录中(对于我来说,该应用程序是app/custom_puput_migrations
,并根据需要进行了编辑。
然后在settings
中输入:
MIGRATION_MODULES = {'puput': 'app.custom_puput_migrations')
然后我从头开始重新创建数据库,然后就消失了。
缺点是您必须保持这些迁移;每次升级第三方应用程序版本时,都需要检查并复制他们可能进行的所有迁移。