首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为从下拉列表中选择的多个值编写django过滤器查询?

如何为从下拉列表中选择的多个值编写django过滤器查询?
EN

Stack Overflow用户
提问于 2019-07-05 06:03:28
回答 3查看 4.3K关注 0票数 2

我编写了一个视图函数,根据某些参数搜索/过滤django中的数据。在字段、类别和位置中,用户可以选择多个选项进行搜索。

我的意见功能如下:

代码语言:javascript
代码运行次数:0
运行
复制
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)

搜索函数应该返回进行搜索的所有类别和位置的数据。例如,如果搜索地点是德里和孟买,那么它应该返回所有的影响者,他们的位置是德里或孟买,同样也是类别。

搜索功能对于单个值来说是完美的,但是对于多个值则不起作用。例如,如果在位置类别中发送德里,则返回正确的结果,但如果选择德里,则只读取第一个值,即德里,并相应地应用过滤器。

如何修改搜索查询以使其正确工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-05 07:23:00

我认为最简单的方法是这样使用问:

代码语言:javascript
代码运行次数:0
运行
复制
 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

代码语言:javascript
代码运行次数:0
运行
复制
  <form  action="{% url 'your search action' %}">
     <input type="text" name="q">
     <input type='submit' value='Search'>
   </form>

您可以像这样将all_queries与解决方案组合在一起:

代码语言:javascript
代码运行次数:0
运行
复制
all_queries = username_queryset_list|fullname_queryset_list|location_queryset_list|
categories_queryset_list
票数 2
EN

Stack Overflow用户

发布于 2019-07-05 06:15:03

你试过为此使用django-filterset吗?

代码语言:javascript
代码运行次数:0
运行
复制
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']

然后,在您的视图中,可以使用以下方法调用此筛选器:

代码语言:javascript
代码运行次数:0
运行
复制
filter_backends = (filters.DjangoFilterBackend,)
filter_class = InfluencerFilter

这将避免所有累赘和冗余的if语句,并且只对可用的查询参数工作,而忽略其余的查询参数。

票数 0
EN

Stack Overflow用户

发布于 2019-07-05 06:20:24

这就是我如何在我的帐户上进行搜索:可能的搜索条件是自由文本(search_value),从选择框中选择组(sel_group),复选框仅活动的(chk_active)

代码语言:javascript
代码运行次数:0
运行
复制
    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)

希望这会有所帮助;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56897321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档