【问题标题】:Exclude an app from Django migrations从 Django 迁移中排除应用程序
【发布时间】:2017-12-31 15:31:45
【问题描述】:

有没有办法从 Django 迁移中排除应用程序的模型?我知道使用managed = False 更改模型元选项是一种选择,但每次都需要编辑很多模型。有没有办法指定我不想迁移其模型的应用?

【问题讨论】:

  • 如果你想排除整个应用的模型,那么可以做到。
  • @ArpitSolanki 这正是我想做的!你知道我该怎么做吗?

标签: django django-models migration


【解决方案1】:

在您的设置中从已安装的应用程序中删除该应用程序。

【讨论】:

  • 你必须在应用的每个模型的class Meta中添加app_label = 'the_app'
  • @epineda 感谢您的评论,这对我有用。批准的答案每次都为我重新创建了 `__init__.py 文件。
  • @AlfaBravo 您在使用 IDE 吗?还是只是一个纤薄的文本编辑器?如果您通过 IDE 运行命令,那可能是您的 IDE 将它们添加回来。
  • @IanKirkpatrick 我正在使用 vs-code,但感谢您的提醒。当我再次遇到这个问题时,我会尝试看看这两个用例是否存在差异。
【解决方案2】:

从应用程序迁移目录中删除 __init__.py 文件应该可以工作。

【讨论】:

  • 这个答案是我特别问的问题的正确答案。然而,就我而言,我使用的是动态模型。当我在运行时生成它们时,我运行makemigrationsmigrate 将它们添加到应用程序的模型中。所以这在我的情况下是行不通的。您对使用动态模型有什么想法吗?
  • 嗯,不确定动态模型,但也许您可以在创建模型后使用ospathlib 库在运行时“触摸”__init__.py 文件? link
  • 这是一种 hack 方式。是的,它有效,但那是因为它使迁移目录不是一个包。迁移文件不再可导入......这就是它们不起作用的原因......它们甚至不被视为代码。这样做的正确方法是告诉 Django 不要包含它们......不要有效地将它们从存在中抹去。
  • 虽然我想如果你只想排除它 1 次然后继续包含它,只要你添加 init,这是一个很好的方法。 py 立即返回,以便 Django 可以再次看到这些文件。
【解决方案3】:

如果您使用数据库路由器,则可以这样做

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return False

示例。

class FilemakerRouter:
    """
    A router to control all database operations on models in the
    filemaker application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read filemaker models go to filemaker.
        """
        if model._meta.app_label == 'filemaker':
            return 'filemaker'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write filemaker models go to filemaker.
        """
        if model._meta.app_label == 'filemaker':
            return 'filemaker'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the filemaker app is involved.
        """
        if obj1._meta.app_label == 'filemaker' or \
           obj2._meta.app_label == 'filemaker':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return False

Search duckduckgo for more details

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2015-04-08
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多