我正在使用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
肯定很奇怪。
答案 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'])