[英]How to override Django apps.py and its AppConfig for third-party apps which is not there?
[英]How to override the migrations of a third-party django package
我以前遇到的所有答案都不清楚或陈旧。
我安装了第三方包并运行了迁移。
问题是第三方包使用 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:我尝试在我的用户应用程序中创建一个空迁移并编写迁移但它没有用。
不知道这是否可行,您可以将用户模型的 ID 设置为适合此应用程序使用的任何内容。 然后制作一个依赖于其他应用程序的最后一次迁移的迁移文件,然后将您的模型和外键转换为您想要的任何内容。
这可以通过 django 的MIGRATION_MODULES
设置来完成。
例如,出于与您的原因非常相似的原因,我需要覆盖puput
应用程序中的迁移(他们硬编码了应该是可交换依赖模型的名称)。
我将所有 puput 的迁移文件复制到我自己的一个应用程序中的一个目录中,在我的例子中是app/custom_puput_migrations
并根据我认为合适的方式编辑它们。
然后在settings
我输入:
MIGRATION_MODULES = {'puput': 'app.custom_puput_migrations')
然后我从头开始重新创建我的数据库,然后它就消失了。
这样做的缺点是您必须维护这些迁移; 每次升级第三方应用程序版本时,您都需要检查并复制他们可能进行的任何迁移。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.