Django фильтр по двум параметрам - PullRequest
0 голосов
/ 30 мая 2020

Я хочу фильтровать по двум параметрам. У меня есть это:

    def get_queryset(self):
        queryset = Product.objects.filter(
             Q(category__in=self.request.GET.getlist("category")) &
             Q(brand__in=self.request.GET.getlist("brand")))
        return queryset

Но это работает, только если выбраны два фильтра (иначе ничего не возвращает). Я хочу, чтобы моя программа выполняла фильтрацию по одному фильтру, если выбран только один, и по двум параметрам, если выбраны два. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Вы можете это сделать.

def get_queryset(self):
  kwargs = {}
  if self.request.GET.getlist("category"):
      kwargs["category__in"] = self.request.GET.getlist("category")

  if self.request.GET.getlist("brand"):
      kwargs["brand__in"] = self.request.GET.getlist("brand")

  return Product.objects.filter(**kwargs)
1 голос
/ 30 мая 2020

Фактически вы можете написать диспетчер моделей для пользовательских наборов запросов. Для получения дополнительной информации вы можете прочитать документацию: https://docs.djangoproject.com/en/3.0/topics/db/managers/#calling -custom-queryset-methods-from-the-manager

class ProductQuerySet(models.query.QuerySet):

def active(self):
    return self.filter(active=True)

def search(self, query):
    lookups = (Q(title__icontains=query) | 
              Q(description__icontains=query) | 
              Q(price__icontains=query) | 
              Q(tag__title__icontains=query))  # (model_name)__(model_field)__(filter)
    return self.filter(lookups).distinct()

класс ProductManager (models.Manager):

def get_queryset(self):
    return ProductQuerySet(self.model, using=self._db)

def active(self):
    return self.get_queryset().active()

def search(self, query):
    return self.get_queryset().active().search(query)

В Views.py:

def get_queryset(self, *args, **kwargs):
    request = self.request
    query = request.GET.get('q', None) 
    if query is not None:
        query = query.strip()
        return Product.objects.search(query)
    return Product.objects.featured()

Надеюсь, это вам поможет. Удачи

1 голос
/ 30 мая 2020
def get_queryset(self):
    queryset = Product.objects.all()
    if "category" in self.request.GET:
        queryset = queryset.filter(category__in=self.request.GET.getlist("category"))
    if "brand" in self.request.GET:
        queryset = queryset.filter(brand__in=self.request.GET.getlist("brand"))
    return queryset

Большинство методов, применяемых к набору запросов, вернут новый набор запросов. Это позволяет вам добавлять дополнительные параметры по мере необходимости. Поскольку набор запросов является ленивым, он фактически не запрашивает базу данных до тех пор, пока вы не начнете потреблять данные, поэтому также нет накладных расходов на производительность для вышеупомянутого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...