Я добавил & вместо | между объектами 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
вернет только одну из двух строк. (Только что проверил... последнюю)