【问题标题】:How do I handle migrations as a Django package maintainer?作为 Django 包维护者,我如何处理迁移?
【发布时间】:2018-01-28 10:17:56
【问题描述】:

我一直在编写一个新的 Django 包,它可以通过 pip 安装。我被困了一段时间,因为我不确定如何为我的特定包进行迁移,以便让安装的正常工作流程成为:

  1. pip 安装我的包
  2. 将我的包裹添加到您的“INSTALLED_APPS”中
  3. 运行python manage.py migrate

目前,我的包裹是这样的:

package_root/
    dist/
    actual_package/
        __init__.py
        models.py
    setup.py

我面临的问题是,当我打包应用程序并使用pip install dist/... 安装它,然后将其添加到我的示例应用程序“INSTALLED_APPS”中时,运行python manage.py migrate 不会为actual_package/models.py 中的模型创建任何表因此我(从用户的角度)需要先运行python manage.py makemigrations actual_package,这并不理想。

关于如何在用户安装之前对迁移进行排序的任何想法都非常好。

【问题讨论】:

  • 实际包中是否包含迁移?解压缩您要上传到 PyPI 的文件并检查文件是否存在。
  • 不,它们不存在,因为我没有生成任何东西。我的问题更多是如何设置一个好的工作流程来实际创建它们,以便我可以打包它们。由于我的包中没有 settings.py 或 manage.py
  • 哦,我明白了。通常的做法是包含测试项目(未打包)。这是我目前正在进行的项目:github.com/genialis/resolwe。要创建迁移,我们运行 ./tests/manage.py makemigrations 即可。
  • 好的,我明白了,谢谢。我想你给了我一些可以工作的东西。

标签: python django django-migrations


【解决方案1】:

1 - 在包中包含初始迁移 - 例如,actual_package/migrations/0001_initial.py

2 - 包括 python manage.py migrate actual_package 作为安装过程的一部分 - 无论是新的还是更新的。

3 - 如果您发布对 actual_package 的更新,请包含任何新的迁移。

这应该适用于新安装和更新。如果迁移已经完成(例如,更新但不包括新的迁移),那么 migrate 命令不会受到影响。

一个关键警告:确保您的包安装检查适当的 Django 版本。版本和代码之间发生了很多变化 - 以及迁移 - 对于一个版本可能不适用于另一个版本。

【讨论】:

  • 虽然这样回答了我的问题,但我想我真的需要知道我们实际上如何为包创建这些迁移,因为包没有 manage.pysettings.py
  • @mattjegan 创建迁移并将它们包含在您的包中 - 即,无论如何您都会创建它们,因此将它们包含在包中 - 以及夹具、测试文件等。当我合并其他打包到我自己的程序中,我一直不得不自己添加到 settings.py - 理论上可以自动化,但我不推荐它 - 太多可能的问题。告诉用户“添加到 settings.py INSTALLED_APPS 然后 manage.py migrate newapp”并不是没有道理的。比我最近在不包含迁移或说明的“出色”应用上浪费时间要好得多。
  • 补充一点:迁移是向前兼容的。确保使用包支持的最旧的主要 Django 版本创建迁移,然后保证它们也可以在较新的版本上工作。
  • @manassehkatz 我承认我并没有超过搜索结果的第一页,但是我所有的搜索来学习如何运行 migrate 作为 django 包安装的一部分只告诉我如何使用一个包或为我自己的代码运行它,而不是如何让我的包安装然后运行migrate。你知道有什么好的资源吗?
【解决方案2】:

阅读 cmets 似乎问题是我们如何在包中为我们的模型创建迁移文件,即对于包开发人员来说,python manage.py makemigrations 是什么。

我通过在 /example/ 的包中包含一个示例 django 项目来解决这个问题,然后如果您使用项目的 manage.pysettings.py 运行 makemigrations,它将神奇地在您的包 migrations 文件夹中创建迁移也是!

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 2021-05-01
    • 2015-06-27
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2018-09-13
    • 2021-08-30
    相关资源
    最近更新 更多