【发布时间】:2018-08-18 05:14:21
【问题描述】:
我正在尝试在我拥有的这个 ListView 中创建一个动态搜索。我的想法是在每次尝试继承此视图时指定搜索的字段和类型。
我的问题是每次我尝试进行搜索时,它只适用于元组的第一个字段。在我的示例中:requests__email 是第一个字段,当我在查询“app”后打印对象 query_q 时,我得到以下输出:
(OR: (AND: ), ('requests__email__icontains', 'app'), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app')), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app'), ('license_type__name__icontains', 'app')))
我不明白为什么,因为我使用的运算符我认为它可以在query_q |= Q(**query_kwargs) 中工作|=。如果我尝试根据其他属性进行搜索,例如status,搜索将不起作用。
views.py
class DefaultListView(ListView):
searchable_fields = (
('requests__email', 'icontains'),
('status', 'icontains'),
('license_type__name', 'icontains'),
)
def get_queryset(self):
form = self.form_class(self.request.GET)
if form.is_valid():
if not self.searchable_fields:
raise AttributeError('searchable_fields has not been configured.')
term = form.cleaned_data['term']
query_kwargs = dict()
query_q = Q()
# Build a list of Q objects based on the searchable attribute
for field, search_type in self.searchable_fields:
query_kwargs["{0}__{1}".format(field, search_type)] = term
query_q |= Q(**query_kwargs)
ordering = self.get_ordering()
queryset = self.model.objects.filter(query_q)
if ordering:
return queryset.order_by(**ordering)
return queryset
return super(DefaultListView, self).get_queryset()
【问题讨论】:
标签: django django-queryset django-q