【问题标题】:Django: get_queryset method for a Search View to filter with multiple fieldsDjango:用于搜索视图的 get_queryset 方法以使用多个字段进行过滤
【发布时间】:2018-09-25 16:48:09
【问题描述】:

我正在处理一个 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 作为关键字,这对我来说并不优雅/pythonic。为国家/地区查询添加另一个if statement 肯定会很奇怪。

【问题讨论】:

    标签: django django-views django-queryset


    【解决方案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')
    }
    

    获取所有查询参数并使用这些参数创建一个 kwargs。除了 if else,我们别无选择。例如 -

        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'])
    

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 2020-10-28
      • 2015-12-02
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2021-03-12
      • 2019-12-25
      相关资源
      最近更新 更多