@sergey19940808

Django, как сделать простой поиск по атрибутам?

Вьюшка:
def search_foto(request):
        title = 'Поиск'

        try:
            query = request.GET['query']
            posts = OurFoto.objects.filter(name__startswith=query) | \
                OurFoto.objects.filter(text__startswith=query) or \
                OurFoto.objects.filter(date_added__startswith=query)
            context = {'title': title, 'posts': posts, 'query': query}
            return render(request, 'repository_our_fotos/search_form.html', context)

        except KeyError:
            return render(request, 'repository_our_fotos/search_form.html')

Почему при совпадении всех атрибутов выдаёт правильный результат, а когда первые 2 верны, а последний не верный, выдаёт другие результаты ? Как написать вьюшку, чтобы реализовать это ?
  • Вопрос задан
  • 351 просмотр
Решения вопроса 1
@immaculate
Программист-путешественник
У вас неправильный код. Есть же отличная родная документация по Django, куча дополнительных материалов, книг. Зачем методом проб и ошибок делать?

Правильно писать:
OurFoto.objects.filter(Q(name__startswith=query) | Q(text__startswith=query) | 
Q(date_added__startswith=query))


При этом в коде еще есть несколько проблем:
  1. непонятно, зачем здесь ловить исключение KeyError, если изучить Python, то можно написать более простой и понятный код типа request.GET.get('query') или if 'query' in request.GET
  2. лучше переходить уже на Class Based Views и Generic Views - код будет проще и не надо будет переписывать в следующих версиях Django (функции-view уже вроде как deprecated)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
https://docs.djangoproject.com/en/1.11/topics/db/q...
Для запросов с оператором OR надо использовать Q object.

from django.db.models import Q


posts = OurFoto.objects.filter(
    Q(name__startswith=query) | Q(text__startswith=query) | Q(date_added__startswith=query)
)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы