Сценарий: большой проект со многими сторонними приложениями. Хотите добавить теги к этим приложениям без необходимости изменять источник приложений.Django: Как динамически добавить поле тега в сторонние приложения, не касаясь исходного кода приложения
Моя первая мысль была первым указать список моделей settings.py (как ['appname.modelname',]
и вызовите функцию register
Джанго-маркировать на каждой из них. Функция регистра добавляет TagField и пользовательский менеджер по указанной модели. проблема с этим подходом является то, что функция должна работать дО схема DB генерируется.
Я попытался запустить функцию register
непосредственно в settings.py
, но мне нужно django.db.models.get_model
, чтобы получить реальную ссылку модели из только строк, и я не может показаться импортированным из settings.py
- независимо от того, что я пытаюсь получить, я получаю ImportError. Функция tagging.register
импортирует ОК.
Итак, я изменил тактику и написал пользовательскую команду управления в противном случае пустым приложением. Проблема в том, что единственный сигнал, который подключается к syncdb, равен post_syncdb
, что бесполезно для меня с тех пор, как он запускается после создания схемы БД.
Единственный другой подход, о котором я могу думать в настоящий момент, состоит в том, чтобы генерировать и запускать миграцию схемы «на юг». Это похоже на взлом, а не на решение.
Кажется, что это должно быть довольно распространенной потребностью, но я не смог найти чистого решения.
Итак, мой вопрос: возможно ли динамически добавлять поля к модели до создания схемы, но, более конкретно, можно добавить теги к сторонней модели без редактирования ее источника.
Чтобы уточнить, я знаю, что можно создавать и хранить теги, не имея TagField для модели, но есть большой недостаток в этом подходе, поскольку трудно одновременно создать и пометить новую модель.
Да, конечно. Но где код для добавления тегов? Мне нужно добавить теги сразу после сохранения объекта - очевидно, что это можно сделать легко, переопределив метод save() объекта, но проблема заключается в том, чтобы избежать изменения приложения. –
Сигнал post_save можно использовать для: http://docs.djangoproject.com/en/1.1/ref/signals/#django.db.models.signals.post_save –
Я думаю, что вы на правильном пути - я рассматриваю возможность использования post_save, но у него есть другая проблема. post_save предоставляет три аргумента: Сохраняемый класс, фактический экземпляр и логическое значение, которое является Истинным, если создается новая запись. Невозможно получить доступ к объекту 'request', где находятся новые теги. –