Django:用于搜索视图的get_queryset方法可过滤多个字段

时间:2018-09-25 16:48:10

标签: django django-views django-queryset

我正在使用HTML表单来过滤多个模型字段。

问题:

如何构建视图,以便即使更改查询也返回单个查询集?

HTML

我的表单会将输入作为kwargs传递,因此请求将像这样-

/search/?order_by=newest
/search/?q=<string>&order_by=newest
/search/?q=<string>&order_by=newest&country=US

这些将过滤:

  • 查询中的string(q = ...)
  • 要订购查询集的order_by
  • country用于按位置字段过滤结果

查看:

我试图在视图中使用单个查询,以消除复杂性并使视图尽可能简单。我该如何利用所有这些潜在的变化并通过一种get_queryset方法?

这就是我现在所拥有的。

def get_queryset(self):
    keywords = self.request.GET.get('q') or None
    order_by = self.order_by_options.get(
        self.request.GET.get('order_by')) or '-date_of_price'
    if keywords:
        query = SearchQuery(keywords)
        vectors = SearchVector('name', weight='A')
        qs = self.model.objects_for_search.annotate(search=vectors).filter(
            search=query).order_by('sold', order_by, '-modified')
    else:
        qs = self.model.objects_for_search.order_by('sold', order_by, '-modified')
    return qs[0:500]

上面的代码存在的问题是,我添加的属性越多,if statements就越多。这段代码的关键字为if statement,这对我来说并不优雅。为国家/地区查询添加另一个if statement肯定很奇怪。

1 个答案:

答案 0 :(得分:1)

kwargs = {
    'q': request.GET.get('q',''),
    'order_by_field': request.GET.get('order_by','-date_of_price'),
    'country': request.GET.get('country','-date_of_price')
}

获取所有查询参数,并对这些参数进行修改。除了别的以外,我们没有其他选择。例如-

    filter_kwargs = {}
    if 'q' in kwargs and kwargs['q']:
        filter_kwargs['keyword'] = kwargs['q']
    if 'country' in kwargs and kwargs['country']:
        filter_kwargs['country'] = kwargs['country']

    result = self.query.objects.filter(**filter_kwargs) \
             .order_by(kwargs['order_by_field'])