python - 如何在 Django 项目启动期间编写数据库 Django 数据库模型实例?
问题描述
有没有办法在 Django 项目的启动阶段用初始化值写入数据库模型实例的值?
我对需要在启动 Django 项目之前调用命令行的迁移不感兴趣。对数据库的更改应保留在数据库更改历史中。
在我的情况下,系统处于 IIoT 环境中:
- 边缘后端
- 一个 MQTT 代理
- 可能有几个终端设备代理。
整个应用程序的运行状态由边缘后端、MQTT 代理和终端设备的运行状态组成。
关于 opstate 的唯一真实来源应该是数据库。这意味着只有边缘后端需要知道 opstate。
最初在每次启动/重启 Django 项目后,所有子组件的运行状态都是未知的。一个数据库模型实例(单例)通过一对一的引用保存整个分布式系统的运行状态。
解决方案
为什么不使用夹具?
django-admin loaddata fixture [fixture ...]
或者
python manage.py loaddata fixture <file>
编辑:
好的,所以你提出 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)
推荐阅读
- tsql - 查询进入新年的周数的最佳方法是什么?
- sqlite - sqlite 的模式匹配不起作用的原因可能是什么?
- php - PHP showing someone's user profile by taking MYSQL infos in HTML
- django - Django:request.META.get('HTTP_REFERER') 在 Ajax 调用后返回 None
- javascript - 可以从一系列承诺中删除承诺吗?
- android - 如果应用程序是通过捆绑发布的,Expo 中的 OTA 更新是否有效?
- r - 即使不满足参数,R dplyr 也可以通过多个列查找 group 的总和并过滤
- android - XML 如何将水平进度条修改为具有progressDrawable 属性的圆形进度条?
- vuetify.js - Vuetify 数据表分页行为怪异,看不到按钮或选择每页的项目
- r - 从 stringi 字符集中的字母数字 id 中排除“I”和“O”