Как я могу записать экземпляры базы данных Django модели базы данных во время запуска проекта Django? - PullRequest
0 голосов
/ 02 февраля 2020

Есть ли способ записать значения экземпляров модели базы данных со значениями инициализации во время фазы запуска проекта Django?

Меня не интересуют миграции, для которых требуется предварительно вызвать командную строку для запуска проекта Django. Изменения в базе данных должны быть постоянными в истории изменений базы данных.

В моем случае система находится в контексте IIoT:

  • Бэкэнд края
  • a MQTT-брокер
  • потенциально несколько агентов конечных устройств.

Рабочее состояние всего приложения состоит из рабочего состояния пограничного бэкэнда, MQTT-брокера и конечных устройств.

Единственным источником правды о государстве является база данных. Это означает, что только базовый сервер должен знать о состоянии.

Первоначально после каждого запуска / перезапуска проекта Django рабочее состояние всех подкомпонентов должно быть неизвестным. Один экземпляр модели базы данных (singleton) хранит рабочее состояние всей распределенной системы посредством однозначных ссылок.

1 Ответ

2 голосов
/ 02 февраля 2020

Почему бы не использовать прибор?

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)
...