<p>首先,我试图解释django管理过滤器的工作原理。当您想在管理页面中过滤查询集时,django会查找所有注册的过滤器。如果使用此值为filter django filter queryset设置值。如果设置多个过滤器django将queryset过滤两次,则等于queryset=查询集过滤器(param1=1).filter(param2=2)或在SQL中:选择。。。其中param1=1和param2=2。因为你不能用标准的django过滤器来做。但您可以编写自己的过滤器,如下所示:</p>
<pre><code>from django.contrib.admin import SimpleListFilter
from django.db.models import Q
from functools import reduce
import operator
from django.core.exceptions import FieldError
class ORListFilter(SimpleListFilter):
title = ''
parameter_name = ''
search_field = ('',)
def queryset(self, request, queryset):
filters = request.GET.copy()
try: #for search
search_field_value = filters.pop('q')[0]
query_params = [Q((key, search_field_value)) for key in self.search_field]
try:
queryset = queryset.filter(reduce(operator.or_, query_params))
except FieldError:
pass
except KeyError:
pass
try:
query_params = [Q((key, value)) for key, value in filters.dict().items()]
queryset = queryset.filter(reduce(operator.or_, query_params))
except TypeError:
pass
return queryset
def lookups(self, request, model_admin):
qs = model_admin.get_queryset(request)
parameters = qs.all().values(self.parameter_name).distinct()
for parameter in parameters:
value = dict(parameter).pop(self.parameter_name, None)
if value:
yield (value, value)
else:
yield (None, 'NULL')
class Field1Filter(ORListFilter):
title = 'title'
parameter_name = 'field1'
search_field = ('search1', 'search2')
class Field2Filter(ORListFilter):
title = 'title'
parameter_name = 'field2'
search_field = ('search1', 'search2')
</code></pre>
<p>并在管理员中注册:</p>
^{pr2}$
<p>它不能与标准的django过滤器一起工作,list_filter中的所有值都必须从ORListFilter类继承。它也不能与日期时间过滤器一起工作,但是你可以添加这个功能。在</p>