继续@iuysal 回答:
要使其通用,您还需要将密钥作为参数传递,为此您需要传递字典,这是我的做法:
像这样创建你的字典:
filters = {'filter1': 'value1', 'filter2__startswith': 'valu', ...}
然后将其传递给您的项目过滤器,如下所示:
Item.objects.filter(*[Q(**{k: v}) for k, v in filters.items() if v], filter3='value3')
我拥有的第一个不那么神秘的版本:
def _filter(filters):
filters = []
for k, v in n.items():
if v:
filters.append(Q(**{k: v}))
return filters
filters = _filter({'name': name})
return Item.objects.filter(*filters)
解包说明:我们想把Q (queries)作为args给objects.filter作为args,而我们想把kwargs给Q()
我现在正在生产中(我将只修改过滤器名称,因为它很敏感):
def get_queryset(self):
filter1 = self.request.GET.get('filter1 ', '')
filter2__startswith = self.request.GET.get('filter2_prefix ', '')
def filters_to_Qs(filters):
return [Q(**{k: v}) for k, v in filters.items() if v]
filters = {'filter1': filter1 ,
'filter2__startswith': filter2__startswith }
return Order.objects.filter(*filters_to_Qs(filters))