如何以编程方式获取最后一次迁移的名称?

15
我想在Django中获取最后一个应用迁移的名称。我知道Django迁移存储在'django_migrations'表中,但是'django.db.migrations.migration.Migration'不是由该表支持的'models.Model'。这意味着你不能这样做: ```python Migration.objects.last() ``` 请问有何解决方案?
migration_info = Migration.objects.all()

有没有内置的方法可以从django_migrations中检索数据,还是我应该创建自己的只读Model:

class MigrationInfo(models.Model):
    class Meta:
         managed = False
         db_table = "django_migrations"

有没有可能只读取迁移文件夹的内容并获取最后添加的文件?这将使用Python的“os”包。 - Robin Papa
2
也许这会有所帮助 https://github.com/django/django/blob/1.9.2/django/core/management/commands/showmigrations.py#L38-L77 - Alexander Larikov
@RobinPapa 不是文件夹中的所有迁移都可以应用。 - Mariusz Jamro
@MariuszJamro 请考虑添加更多细节或接受一个答案,因为这个问题已经相当老了但仍然活跃。 - creyD
3个回答

27

这适用于 Django 1.11/1.8/2.1 和 3.0.4:

from django.db.migrations.recorder import MigrationRecorder

last_migration = MigrationRecorder.Migration.objects.latest('id')
print(last_migration.app)     # The app where the migration belongs
print(last_migration.name)    # The name of the migration

这个命令似乎没有相关文档,但是在这里你可以找到被适当记录的源代码。


适用于Django 1.8 - AlanSE
同样适用于Django 2.1。 - Kalob Taulien
在我的3.0.4版本中可以运行! - creyD
适用于Django 4.0 - 5parkp1ug

5

为了储存关于已应用迁移的信息,Django使用普通表格,并且可以通过MigrationRecorder类以@classproperty方式访问:

from django.db.migrations.recorder import MigrationRecorder

lm = MigrationRecorder.Migration.objects.filter(app='core').last()

从命令行轻松获取此信息也很简单:

获取特定应用程序的最新应用迁移

python manage.py showmigrations --list <app_name> | grep "\[X\]" | tail -1

获取未应用的迁移有序列表

python manage.py showmigrations --plan | grep "\[ \]"

你能检查一下这个链接吗:https://dev59.com/2r3pa4cB1Zd3GeqPpPyM,我无法使用model_create以及projectstate和modelstate来应用迁移。字段已经正确指定,并尝试了创建模型的测试用例方式。我是否需要在迁移中特别调用addfield removefield? - Gary

-2
更简单的方法是,您还可以解析出以下命令的最后一行:
./manage.py showmigrations

这不起作用,因为showmigrations的输出是按应用程序名称排序的,而最后一行可能是尚未运行的迁移。Dariem Pérez Herrera的解决方案是我认为正确的方法。 - Dean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接