Я добавил & вместо | между объектами Q, но это не работает

Иногда я ищу только тип и цвет. или только название и год, поэтому Q должен быть в состоянии скомпилировать запрос вместе

например, если я напишу "url/search/?q=action&q=Blue", он вернет только последний запрос, который в данном случае является "Blue"

views.py

    def search_result(request):
query = request.GET.get('q')
qs = Content.objects.distinct().search(query=query)

query_string = request.GET.get('q')
query_string = query_string.replace(';',',')

page = request.GET.get('page', 1)
pagination = Paginator(qs, CONTENTS_PER_PAGE)

try:
qs = pagination.page(page)
except PageNotAnInteger:
qs = pagination.page(CONTENTS_PER_PAGE)
except EmptyPage:
qs = pagination.page(pagination.num_pages)

context = {
'SearchResults': qs,
'query': query_string,
}

return render(request,
'home/search_result.html',
context)

models.py

class ContentQuerySet(models.QuerySet):
def search(self, query=None):
if query is None or query == "":
return self.none()
lookups = Q(genre__name__icontains=query) & Q(distributor__icontains=query) & Q(title__icontains=query) & Q(channels__name__icontains=query) & Q(year__icontains=query)
return self.filter(lookups)

class ContentManager(models.Manager):
def get_queryset(self):
return ContentQuerySet(self.model, using=self._db)
def search(self, query=None):
return self.get_queryset().search(query=query)

class ChannelQuerySet(models.QuerySet):
def search(self, query=None):
if query is None or query == "":
return self.none()
lookups = Q(name__icontains=query)
return self.filter(lookups)

class ChannelManager(models.Manager):
def get_queryset(self):
return ChannelQuerySet(self.model, using=self._db)
def search(self, query=None):
return self.get_queryset().search(query=query)

В тех случаях, когда параметр querystring повторяется, как "q" в q=action&q=Blue, необходимо использовать метод getlist querydict:

query_strings = request.GET.getlist('q')

, который должен вернуть ['action', 'Blue']

См. документ QueryDict doc. Метод get вернет только одну из двух строк. (Только что проверил... последнюю)

Вернуться на верх