Сценарий: большой проект со многими сторонними приложениями. Хотите добавить теги к этим приложениям без изменения источника приложений.
Моей первой мыслью было сначала указать список моделей в settings.py (например, ['appname.modelname',]
, и вызвать функцию register
django-tagging для каждой из них. Функция регистрации добавляет TagField и собственный менеджер к указанной модели. Проблема этого подхода в том, что функция должна запускаться ДО создания схемы БД.
Я попытался запустить функцию register
непосредственно в settings.py
, но мне нужно django.db.models.get_model
, чтобы получить фактическую ссылку на модель только из строки, и я не могу импортировать ее из settings.py
- неважно что я пытаюсь получить ImportError. Однако функция tagging.register
импортирует OK.
Поэтому я сменил тактику и написал собственную команду управления в другом пустом приложении. Проблема в том, что единственный сигнал, который подключается к syncdb - это post_syncdb
, который для меня бесполезен, так как он срабатывает после того, как схема БД была сгенерирована.
Единственный другой подход, который я могу придумать на данный момент, - это генерировать и запускать миграцию схемы базы данных, подобную «на юг». Это больше похоже на взлом, чем на решение.
Кажется, это должно быть довольно распространенной потребностью, но я не смог найти чистого решения.
Итак, мой вопрос: возможно ли динамическое добавление полей в модель ДО создания схемы, но, в частности, можно ли добавлять теги к сторонней модели без редактирования ее источника.
Чтобы уточнить, я знаю, что можно создавать и хранить теги, не имея TagField на модели, но в этом подходе есть существенный недостаток, заключающийся в том, что сложно одновременно создавать и маркировать новую модель.