Спасибо.
Суть такова (очень-очень упрощенно):
Есть простая модель сущностей:
class Essence(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
type = models.ForeignKey(Category, on_delete=models.CASCADE, null=False, blank=False)
Этот класс содержит, к примеру, уникальный идентификатор для сущности Дуся Иванова (тип 1) и для компании Заготзерно (тип 2).
Как понимаете, для этих сущностей есть различные атрибуты : для Дуси - это имя, фамилия (ограничимся), для Заготзерна - полное и краткое наименование и т.п.
На самом деле типов сущностей гораздо больше (целая древовидная модель Category). Еще одна модель поддерживает систему сложных связей между сущностями (несколько типов - социальные, гражданско-правовые, проч).
Но не суть дела. Главное - какой набор атрибутов захочется влепить пользователю - не известно. Более того, Дуся может выйти замуж и стать Пупкиной. Но у бухгалтеров должно быть все валидно - до замужества в ведомости она Иванова, а после - Пупкина.
Другими словами, каждый атрибут может быть а) сложной структурой данных (например, геокоординаты) б) временным рядом
Для решения этой задачи мы сделали следующее:
- Создали модель Schema, определяющее атрибут
- Создали генератор полей модели на основе этой схемы данных
- Создали фабрику динамических моделей с этими полями и меткой времени - то есть модели, которые генерируются непосредственно в момент исполнения кода (их нет в "написанном" виде, они созданы через
model = type(name, (models.Model,), fields)
)
- Эти модели связаны ForeignKey c Essence (в простонародье это
называется "шестая нормальная форма")
И вроде все прекрасно работает в 99% времени. Но!
Мы попались на продакшене :-( Суть проблемы: в некоторые моменты времени у разных пользователей одной и той же системы оказывается разный набор моделей, загруженных в память. Например, админ удалил атрибут, а с ним и соответствующую модель из памяти, и таблицу из базы данных. А другой пользователь ни сном, ни духом об этом не знает, и влетает в жесткое исключение.
Примерно так.
Вот ломаем голову, что делать.
Updated 20 April 2021, 1:52 by Timur.