Django Migrations模型在哪?如何导入该模型建立外键关联?
该需求可以正常实现,Django内置的迁移记录模型没有做对外关联的限制,不需要你手动复刻django_migrations表结构做自定义模型。
导入Django内置Migration模型的正确方式
Django的迁移记录模型没有放在常规应用的models模块中,而是内置在迁移记录器类里,导入方式如下:
from django.db.migrations.recorder import MigrationRecorder # 拿到映射django_migrations表的模型类 Migration = MigrationRecorder.Migration
这个模型自带的字段和django_migrations表结构完全对应:
id:表主键app:迁移所属的应用标识,字符类型name:迁移文件名,比如0001_initial、0002_add_user_field这类applied:迁移执行完成的时间戳,时间类型
自定义外键关联的实现参考
结合你多Schema多租户的架构,追踪客户端迁移版本的模型可以参考如下写法,放在你public schema对应的公共应用里即可:
from django.db import models from django.db.migrations.recorder import MigrationRecorder Migration = MigrationRecorder.Migration class ClientMigrationStatus(models.Model): client_identifier = models.CharField(max_length=128, unique=True, verbose_name="客户端唯一标识") target_schema = models.CharField(max_length=64, unique=True, verbose_name="客户端独立Schema名") latest_migration = models.ForeignKey( Migration, on_delete=models.PROTECT, null=True, verbose_name="该Schema已执行的最新迁移记录" ) class Meta: db_table = "client_migration_tracking" app_label = "public_common_app" # 替换成你public schema下的公共应用名
适配多Schema架构的注意事项
- 每个独立客户端Schema下都会维护自己的
django_migrations表,不要跨Schema做外键关联。执行某个客户端Schema的迁移操作前,先把数据库连接的搜索路径切换到对应客户端Schema,再操作Migration模型,此时取到的就是该Schema自己的迁移记录。 - 给指定客户端推送版本、执行完对应迁移后,直接在当前Schema连接下执行
Migration.objects.order_by("-applied").first()就能拿到最新的迁移记录,直接更新到ClientMigrationStatus表的latest_migration字段即可,不需要额外做复杂查询。 - 不要修改Migration模型的原有字段、不要给它动态加自定义属性,所有扩展逻辑都放在你自己定义的追踪模型上,避免干扰Django内置的迁移执行逻辑,引发递归迁移报错。
- 如果使用了多Schema相关的第三方库,记得把这个追踪表配置到public Schema的共享应用列表里,不要让它被同步到每个客户端的独立Schema中。
内容的提问来源于stack exchange,提问作者Dallas Caley
相关产品推荐
相关产品推荐

