首页 > 解决方案 > 如何在 Django 项目启动期间编写数据库 Django 数据库模型实例?

问题描述

有没有办法在 Django 项目的启动阶段用初始化值写入数据库模型实例的值?

我对需要在启动 Django 项目之前调用命令行的迁移不感兴趣。对数据库的更改应保留在数据库更改历史中。

在我的情况下,系统处于 IIoT 环境中:

整个应用程序的运行状态由边缘后端、MQTT 代理和终端设备的运行状态组成。

关于 opstate 的唯一真实来源应该是数据库。这意味着只有边缘后端需要知道 opstate。

最初在每次启动/重启 Django 项目后,所有子组件的运行状态都是未知的。一个数据库模型实例(单例)通过一对一的引用保存整个分布式系统的运行状态。

标签: pythondjangopython-3.xdjango-models

解决方案


为什么不使用夹具?

django-admin loaddata fixture [fixture ...]

或者

python manage.py loaddata fixture <file>

编辑:

好的,所以你提出 2 点:

  1. 应该有一个历史记录在数据库中。
  2. 不应触发信号。

第1点:

由于loaddata不是使用模型来创建实例并保存它们,我不知道它如何处理历史记录。也许其他人可以在这里称重?

第 2 点:

至于信号,这是在加载固定装置时避免信号触发的方法,如官方 django 文档中所述:

处理夹具文件时,数据按原样保存到数据库中。不调用模型定义的 save() 方法,并且任何 pre_save 或 post_save 信号都将使用 raw=True 调用,因为实例仅包含模型本地的属性。例如,您可能想要禁用访问在夹具加载期间不存在的相关字段的处理程序,否则会引发异常:

from django.db.models.signals import post_save
from .models import MyModel

def my_handler(**kwargs):
    # disable the handler during fixture loading
    if kwargs['raw']:
        return
    ...

post_save.connect(my_handler, sender=MyModel)

推荐阅读