【问题标题】:django redistributable app with southdjango 可再发行应用程序与南
【发布时间】:2012-06-21 20:56:17
【问题描述】:

打算重新分发的 Django 应用没有 manage.py(也没有 settings.py,因为它是项目的一部分,而不是应用程序的一部分)。

在这种情况下如何运行 schemamigration --auto?为了做到这一点,我是否需要有一个最小的 settings/manage.py 作为应用程序存储库的一部分?有没有办法用 django-admin.py 做到这一点?

【问题讨论】:

    标签: django django-south


    【解决方案1】:

    您只需将应用程序添加到您的Installed_Apps 中的settings.py

    然后你可以运行./manage.py schemamigration <app_name> --auto

    如果应用没有任何迁移,您需要先运行./manage.py schemamigration <app_name> --initial,然后再运行./manage.py schemamigration <app_name> --auto

    【讨论】:

    • 该应用没有 settings.py 或 manage.py(这就是问题所在)。应用程序通常只是包含 urls.py、models.py 等的包,没有项目部分(manage.py、settings.py)
    • 应用程序只是一组可以添加到项目中的视图、模型和模板。项目是 Django 实例和 manage.py 文件所在位置的设置集合。您需要将应用程序添加到现有项目或为其创建一个。有关应用程序和项目之间差异的描述,请参阅此 SO 答案:stackoverflow.com/a/734321/992040
    • 是的,我明白这一点。但是可再分发应用程序中的模型本身可以进行南迁移。我目前找不到具有模型迁移的可插拔应用程序的示例。理想情况下,应用程序存储库中不会包含项目工件。
    • 是的,因此,当您将可插拔应用程序添加到项目的 settings.py 中的 Installed_Apps 并使用项目的 manage.py 运行架构迁移时,它将应用可插拔应用程序中的所有迁移到项目 settings.py 中定义的数据库
    • 这就是我现在的工作方式(不幸的是)。这会在我的 virtualenv 中生成一个迁移 py 文件,然后需要将其复制回应用程序存储库。这感觉像是一个非常不令人满意的解决方案,因为能够在没有特定上下文的情况下运行 schemamigration 命令会很好(因为实际上不需要为应用程序生成迁移)
    【解决方案2】:

    刚刚设法让这个在我的一个项目中发挥作用。这是对我有用的代码:

    import sys
    
    from django.conf import settings
    from django.core.management import call_command
    
    
    if not settings.configured:
        settings.configure(
            ROOT_URLCONF='',
            DEBUG=False,
            DATABASES={
                'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': 'test.db'
                }
            },
            INSTALLED_APPS=(
                'south',
                'my_app',
            )
        )
    
    if __name__ == "__main__":
        call_command('schemamigration', 'my_app', 
                     initial=len(sys.argv) > 1,
                     auto=len(sys.argv) == 0
    

    上面的脚本保存为migrate.py,并使用python migrate.pypython migrate.py i运行(i可以是任何东西,如果存在,它将使用--initial而不是--auto)。显然,您可以执行更高级的命令行选项解析,但这对我有用。

    编辑:更新了脚本,DATABASES 键丢失。在这个项目中,我使用相同的数据库来测试代码,所以它不是一个完全任意的配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多