Unable to get repr for <class 'django.db.models.query.QuerySet'>. Поиск по тегам в плагинах django

20 апреля 2015 г. 8:10

Захотелось мне реализовать поиск картинок по названию тега (Картинка - это мною написанный django-cms плагин; а теги - подключённое приложение taggit), но не тут-то было. Впрочем, всё по-порядку.

Во-первых, имеем модель:

# models.py
class Picture(CMSPlugin):
    pic = models.ImageField(u'Картинка', upload_to='pictures', max_length=255)
    tags = TaggableManager(blank=True)

А во-вторых, нужно найти картинки по необходимому тегу. И если мы захотим осуществить поиск как-то так:

pictures = Picture.objects.filter(placeholder__page__publisher_is_draft=True).filter(tags__name=search_value)  

то ничего не выйдет. Не сработает: Django сообщит Unable to get repr for <class 'django.db.models.query.QuerySet'>.

Скажу честно, я так и не смог понять, почему код выше не работает.

Мне пришлось написать следующий код, чтобы решить мою задачу. Впрочем, он мне даже больше нравится! Быстрее работает: не нужно все картинки перебирать. А наоборот, проходимся по всем тегам и находим те теги, которые ссылаются на нужный нам объект через свойство content_object. PicturePlugin - это название моего плагина.

# views.py
def search(request):
    if 'search_value' in request.GET:
        search_value = request.GET['search_value']

        try:
            tag = Tag.objects.filter(name=search_value)[0]
        except IndexError:
            tag = None

        ctx = {'search_value': search_value}

        if tag:
            pictures = []
            items = tag.taggit_taggeditem_items.all()
            for item in items:
                if hasattr(item.content_object, 'plugin_type'):  # Если объект имеет свойство plugin_type, значит это плагин
                    if item.content_object.plugin_type == 'SBPicturePlugin' and not item.content_object.placeholder.page.publisher_is_draft:  # Ищем только в опубликованных страницах
                        pictures.append(item.content_object)

            ctx.update({'pictures': pictures})

        return render(request, 'search.html', ctx)

    return redirect('/')

Вот теперь работает!

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Права на использование материала, расположенного на этой странице http://vivazzi.pro/it/search-by-tags/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.pro/it/search-by-tags/">http://vivazzi.pro/it/search-by-tags/</a>

Подробнее: Правила использования сайта

Комментариев: 0

Вы можете оставить комментарий как незарегистрированный пользователь. Но, зарегистрировавшись, вы сможете получать оповещения об ответах, а также иметь доступ к своему личному аккаунту для просмотра своих комментариев.

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте