繁体   English   中英

将初始配置数据添加到 Python Django 实例的最佳做法是什么?

[英]What are best practices for adding initial configuration data to a Python Django instance?

我有一个 Django 应用程序,它的Setting为 model。我已经通过 Django 管理 UI/Django 控制台手动将配置数据添加到数据库中,但我想 package 添加此数据并在个人创建/升级时自动创建它这个应用程序的实例。 实现这一目标的最佳方法有哪些?

我已经看过:

  1. Django 迁移主题文档,其中包括有关数据迁移的部分
    • 显示了数据迁移,但它涉及更新数据库中已存在的数据,而不是添加新数据。
  2. Django 迁移操作参考
    • 显示了使用RunSQLRunPython的示例,但两者都仅在添加最少量数据时使用。
  3. 如何创建数据库迁移
    • 查看在应用程序之间移动数据。
  4. 如何为模型提供初始数据
    • 提到了前面文档中涵盖的数据迁移,并为数据提供了固定装置。

我仍然没有找到一个似乎与我描述的用例一致的。

我还查看了关于该主题的几个 StackOverflow 问答,但所有这些都相当陈旧,可能没有涵盖过去 8 年以上发生的任何改进:

这个应用程序中有相当多的设置,随着数据量的增加,上述方法似乎非常费力。

我已经使用固定装置(例如manage.py dumpdata )将数据导出(到 JSON),但我不希望人们在安装应用程序时必须运行固定装置来插入数据。

感觉应该有一个非常简单的方法来说,“嘿,抓住这个 csv、json、yaml 等文件并填充模型。”

目前的想法

除非这里的每个人都提出更好的建议,否则我的想法是在数据迁移中加载 JSON 并通过使用RunSQLRunPython插入数据进行迭代。 还有其他建议吗?

我不建议(直接)使用数据库来访问设置。 因为它会使代码变得混乱。 例如,对于每个设置,您必须调用数据库并且必须像MyModel.objects.get(...)一样进行查询。 即使你写了一个function来减少重复的代码,它仍然不会减少数据库查询。

因此,如果您的设置是动态变化的,我建议使用像django-constance这样的库。 在 Django Constance 中,您可以将默认配置存储在 settings.py 中(或者单独的 python 文件,可以在 settings.py 中导入)。 像这样(从文档中复制粘贴):

INSTALLED_APPS = (
    ...
    'constance',
)

CONSTANCE_CONFIG = {
    'BANNER': ("The national cheese emporium", 'Name of the shop '
                       'The national cheese emporium'),
    ...
}

管理站点将如下所示:

在此处输入图像描述

并访问代码中的变量:

from constance import config

print(config.BANNER)

然后您可以根据需要修改管理站点中的值。 我之所以推荐这种方式,是因为该设置应该可以从代码轻松访问,并且您可以从管理站点动态修改设置。 还可以使用自定义字段和其他功能配置设置。

如果您想要使用 Django-Constance 更新此应用程序的预先存在的实例,那么我建议编写一个Django 管理命令,它将表从现有设置同步到 Django Constance 表。

你应该使用docker来设置你的环境

此处查找有关如何使用 Django 执行此操作的文章。

如果需要了解 docker 及其工作原理,请访问 go 至docker 文档

我们可以在 django 应用程序的开头运行 function。 假设我们有一个名为 core 的应用程序,在我们的 apps.py 文件中

from django.apps import AppConfig

class CoreConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'core'

    def ready(self):
        # your initial work at the start of app
        from core.utils import populate_initial_settings
        populate_initial_settings()

这将在 django 服务器每次启动时运行,因此您必须相应地处理逻辑。 就像首先对设置对象进行计数一样,如果计数 = 0,则填充设置 model,否则不填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM