Django: Как динамически добавлять поле тегов в сторонние приложения, не касаясь исходного кода приложения - PullRequest
0 голосов
/ 14 марта 2010

Сценарий: большой проект со многими сторонними приложениями. Хотите добавить теги к этим приложениям без изменения источника приложений.

Моей первой мыслью было сначала указать список моделей в 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 на модели, но в этом подходе есть существенный недостаток, заключающийся в том, что сложно одновременно создавать и маркировать новую модель.

1 Ответ

1 голос
/ 15 марта 2010

Из документов:

Вам не нужно регистрировать свои модели чтобы использовать их с пометкой приложение - многие функции добавлены при регистрации просто удобные обертки по всему API тегирования, предоставляемый тегом, и TaggedItem модели и их менеджеры, как документировано ниже.

Посмотрите документацию по API и приведенные ниже примеры того, как можно добавлять теги к любому произвольному объекту в системе.

http://api.rst2a.com/1.0/rst2/html?uri=http://django-tagging.googlecode.com/svn/trunk/docs/overview.txt#tags

Обновлено

#views.py
def tag_model_view(request, model_id):
    instance_to_tag = SomeModel.objects.get(pk=model_id)
    setattr(instance_to_tag, 'tags_for_instance', request.POST['tags'])
    ...
    instance_to_tag.save()
    ...returns response

#models.py
#this is the post_save signal receiver
def tagging_post_save_handler(sender, instance, created):
    if hasattr(instance, 'tags_for_instance'):
        Tag.objects.update_tags(instance, instance.tags_for_instance)
...