如何为从下拉列表中选择的多个值编写 Django 过滤器查询?
How to write a django filter query for multiple values selected from a dropdown list?
我根据某些参数在 django 中为 search/filter 我的数据编写了一个视图函数。在字段类别和位置中,用户可以 select 多个选项来进行搜索。
我的观点功能如下:
def search(request):
queryset_list = Influencer.objects.order_by('-followers').distinct().values('id',
'full_name','username','photo','email_id','location_city','categories__name','website')
# Username
if 'username' in request.GET:
username = request.GET['username']
if username:
queryset_list = queryset_list.filter(username__icontains=username)
#Full Name
if 'fullname' in request.GET:
fullname = request.GET['fullname']
if fullname:
queryset_list = queryset_list.filter(full_name__icontains=fullname)
# Location
if 'location' in request.GET:
location = request.GET['location']
for i in location:
queryset_list = queryset_list.filter(location_city__icontains=i)
# Categories
if 'categories' in request.GET:
categories = request.GET['categories']
if categories:
queryset_list = queryset_list.filter(categories__name__iexact=categories)
搜索功能应该return 搜索的所有类别和位置的数据。例如如果搜索德里和孟买的位置,那么它应该 return 所有位置为德里或孟买的影响者,类别也是如此。
搜索功能非常适合单个值,但不适用于多个值。例如,如果德里在位置类别中发送,那么它 returns 正确的结果但是如果德里,孟买是 selected 那么它只读取第一个值,即德里并相应地应用过滤器。
我应该如何修改搜索查询以使其正常工作?
您尝试过使用 django-filterset 来达到这个目的吗?
class InfluencerFilter(filters.FilterSet):
username = filters.CharFilter(name='username', lookup_expr='iexact')
fullname = filters.CharFilter(name='fullname', lookup_expr='iexact')
location = filters.NumberFilter(name='location', lookup_expr='exact')
categories = filters.CharFilter(name='categories', lookup_expr='exact')
class Meta:
model = Influencer
fields = ['username','fullname','location','categories']
然后在您的视图中,您可以使用以下方式调用此过滤器:
filter_backends = (filters.DjangoFilterBackend,)
filter_class = InfluencerFilter
这将使您免于所有繁琐和冗余的 if 语句,并且仅适用于可用的查询参数而忽略其余部分。
我是这样搜索我的帐户的:可能的搜索条件是自由文本 (search_value),来自 select 框的 select 组 (sel_group) , 复选框只有活动的 (chk_active)
def post(self, request, *args, **kwargs):
search_value = request.POST.get('searchValue', None)
sel_group = request.POST.get('selGroup', 'ALL')
chk_active = request.POST.get('chkActive', 0)
filters = Q()
if chk_active == '1':
filters = filters & Q(is_active=True)
if sel_group != 'ALL':
filters = filters & Q(involvements__group__pk=sel_group)
search_value = None if (search_value == '' or len(search_value) < 3) else search_value
if search_value is not None:
filters = filters & Q(last_name__icontains=search_value) | Q(first_name__icontains=search_value) | Q(email__icontains=search_value)
users = get_user_model().objects.filter(filters)
context = self.get_context_data(object_list=users)
return render(request, template_name=self.template_name, context=context)
希望对您有所帮助 ;)
我认为最简单的方法是这样使用Q
from django.db.models import Q
q = request.GET.get('q')
if q:
queryset_list = queryset_list.filter(Q(username__icontains=q)|Q(full_name__icontains=q)|
Q(location_city__icontains=q)|Q(categories__name__iexact=q))
return render(....
else:
messages.info(request,'no results found for {}',format(q))
并在您的模板中使用name=q
搜索表单。
<form action="{% url 'your search action' %}">
<input type="text" name="q">
<input type='submit' value='Search'>
</form>
或您可以像这样将您的all_queries与您的解决方案结合起来:
all_queries = username_queryset_list|fullname_queryset_list|location_queryset_list|
categories_queryset_list
我根据某些参数在 django 中为 search/filter 我的数据编写了一个视图函数。在字段类别和位置中,用户可以 select 多个选项来进行搜索。
我的观点功能如下:
def search(request):
queryset_list = Influencer.objects.order_by('-followers').distinct().values('id',
'full_name','username','photo','email_id','location_city','categories__name','website')
# Username
if 'username' in request.GET:
username = request.GET['username']
if username:
queryset_list = queryset_list.filter(username__icontains=username)
#Full Name
if 'fullname' in request.GET:
fullname = request.GET['fullname']
if fullname:
queryset_list = queryset_list.filter(full_name__icontains=fullname)
# Location
if 'location' in request.GET:
location = request.GET['location']
for i in location:
queryset_list = queryset_list.filter(location_city__icontains=i)
# Categories
if 'categories' in request.GET:
categories = request.GET['categories']
if categories:
queryset_list = queryset_list.filter(categories__name__iexact=categories)
搜索功能应该return 搜索的所有类别和位置的数据。例如如果搜索德里和孟买的位置,那么它应该 return 所有位置为德里或孟买的影响者,类别也是如此。
搜索功能非常适合单个值,但不适用于多个值。例如,如果德里在位置类别中发送,那么它 returns 正确的结果但是如果德里,孟买是 selected 那么它只读取第一个值,即德里并相应地应用过滤器。
我应该如何修改搜索查询以使其正常工作?
您尝试过使用 django-filterset 来达到这个目的吗?
class InfluencerFilter(filters.FilterSet):
username = filters.CharFilter(name='username', lookup_expr='iexact')
fullname = filters.CharFilter(name='fullname', lookup_expr='iexact')
location = filters.NumberFilter(name='location', lookup_expr='exact')
categories = filters.CharFilter(name='categories', lookup_expr='exact')
class Meta:
model = Influencer
fields = ['username','fullname','location','categories']
然后在您的视图中,您可以使用以下方式调用此过滤器:
filter_backends = (filters.DjangoFilterBackend,)
filter_class = InfluencerFilter
这将使您免于所有繁琐和冗余的 if 语句,并且仅适用于可用的查询参数而忽略其余部分。
我是这样搜索我的帐户的:可能的搜索条件是自由文本 (search_value),来自 select 框的 select 组 (sel_group) , 复选框只有活动的 (chk_active)
def post(self, request, *args, **kwargs):
search_value = request.POST.get('searchValue', None)
sel_group = request.POST.get('selGroup', 'ALL')
chk_active = request.POST.get('chkActive', 0)
filters = Q()
if chk_active == '1':
filters = filters & Q(is_active=True)
if sel_group != 'ALL':
filters = filters & Q(involvements__group__pk=sel_group)
search_value = None if (search_value == '' or len(search_value) < 3) else search_value
if search_value is not None:
filters = filters & Q(last_name__icontains=search_value) | Q(first_name__icontains=search_value) | Q(email__icontains=search_value)
users = get_user_model().objects.filter(filters)
context = self.get_context_data(object_list=users)
return render(request, template_name=self.template_name, context=context)
希望对您有所帮助 ;)
我认为最简单的方法是这样使用Q
from django.db.models import Q
q = request.GET.get('q')
if q:
queryset_list = queryset_list.filter(Q(username__icontains=q)|Q(full_name__icontains=q)|
Q(location_city__icontains=q)|Q(categories__name__iexact=q))
return render(....
else:
messages.info(request,'no results found for {}',format(q))
并在您的模板中使用name=q
搜索表单。
<form action="{% url 'your search action' %}">
<input type="text" name="q">
<input type='submit' value='Search'>
</form>
或您可以像这样将您的all_queries与您的解决方案结合起来:
all_queries = username_queryset_list|fullname_queryset_list|location_queryset_list|
categories_queryset_list