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

20 апреля 2015 г. 12: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 оценок)

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

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

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

Автор статьи

Артём Мальцев

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

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

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

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

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

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

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

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

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

Попробуйте

Выберите валюту для отображения денежных единиц