Заменить модель BaseStateMachineDump на поле StateMachineLocatorField
Для нагляности, вот код абстрактной модели BaseStateMachineDump:
class BaseStateMachineDump(models.Model):
state_class_locator = models.CharField(
'Класс состояния',
blank=True,
help_text='Тип состояния, в котором сейчас находится диалог с пользователем. '
'В поле хранится локатор класса состояния, похожий на строку адреса URL. '
'Локатор начинается со слэша <code>/</code> и заканчивается слэшом <code>/</code>, '
'содержит только латинские символы a-z, цифры, знаки тире, подчёркивания и слэша <code>/</code>. '
'Строго нижний регистр букв.',
validators=[validate_state_class_locator_friendly_to_user],
)
state_params = models.JSONField(
'Параметры состояния',
null=True,
blank=True,
help_text='Дополнительные параметры того состояния, в котором сейчас находится диалог с пользователем.',
)
class Meta:
abstract = True
verbose_name = "Стейт-машина"
verbose_name_plural = "Стейт-машины"
constraints = [
models.CheckConstraint(
check=models.Q(
state_class_locator__regex=STATE_CLASS_LOCATOR_PATTERN) | models.Q(state_class_locator=''),
name="correct_state_class_locator_format",
),
]
По идее, можно упаковать два поле в одно JSONField, при этом не потеряв в гибкости. Поле state_class_locator станет одним из атрибутов JSONField.
С одним кастомным полем БД проще работать, чем с абстрактной моделью:
- в прикладном коде сразу видно какие поля есть в модели, не надо заглядывать в документацию
- поле сразу идёт с кастомным полем формы и виджетом админки --> проще конфигурация админки
- поле можно использовать в моделях рассылки, где название
BaseStateMachineDumpуже плохо подходит по смыслу -- там хранится не дамп, а адрес для перевода стейт-машины в новое состояние - поле всё также хорошо подходит для поиска средствами БД благодаря JSONB
Если поле будет возвращать не питоновский словарь, а объект StateLocator, то к объекту можно будет сразу приложить полезные методы:
- Проверить корректность заполнения state class locator
- Сериализовать объект в строку (навигация по стейтам в командах бота)
- Сериализовать объект в URL перевода бота в указанный стейт
Edited by Евгений Евсеев