You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:48:17