【问题标题】:multiple filter parameters in a view视图中的多个过滤器参数
【发布时间】:2009-12-25 18:12:17
【问题描述】:

我有一个基本的搜索视图。它当前在数据库中查询来自特定客户端的任何对象。视图代码如下:

def search_page(request):
        form = PrdSearchForm() 
        prdlinks = [] 
        show_results = True 
        if request.GET.has_key('query'): 
                show_results = True 
                query = request.GET['query'].strip() 
                if query:
                        form = PrdSearchForm({'query' : query}) 
                        prdlinks = \
                                ProjectRecord.objects.filter(client__icontains=query)

        if len(prdlinks) >= 1:
            records = ProjectRecord.objects.filter(client__icontains=query)
            t = get_template('org_list_client.html')
            html = t.render(Context({'records': records}))
            return HttpResponse(html)

        else:
            tpl = "prd_search.html"
            variables = RequestContext(request, { 'form': form, 
            'prdlinks': prdlinks, 
            'show_results': show_results}) 
            return render_to_response(tpl, variables)

我希望搜索字段同时检查客户和帐户的对象。我认为,这将涉及更改此代码:

if query:
        form = PrdSearchForm({'query' : query}) 
        prdlinks = \
                 ProjectRecord.objects.filter(client__icontains=query)

包括ProjectRecord.objects.filter(account__icontains=query)。任何人都可以在语法方面提供帮助,还是我要完成的工作涉及更多?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    我认为您正在寻找 Q 对象(由 MYYN 引用)

    from django.db.models import Q
    
    records=ProjectRecord.objects.filter(
      Q(client__icontains=query) |
      Q(account__icontains=query)
    )
    

    complex-lookups-with-q-objects

    【讨论】:

    • 尝试导入 Q 对象。问题是,如果我不将 prdlinks 与 acclinks 分开,Q 查询将适用于客户端对象,因为它满足第三个“if”查询:“if len(prdlinks) >= 1:...” 但是,如果搜索词是帐户名称(而不是客户名称),查询确实返回“prdlink”但不返回任何记录,因为 if 查询正在寻找(client__icontains=query)。结果是它呈现一个空模板。 (并且不会继续评估以下要求 (account__icontains=query) 的“elif”查询)。
    【解决方案2】:

    你可以试试chain filters,点赞:

    >>> ProjectRecord.objects.filter(
    ...    client__icontains=query).filter(account__icontains=query)
    

    这将首先过滤包含查询的客户端,然后过滤该帐户还包含查询的结果查询集。

    一般形式:

    >>> Entry.objects.filter(
    ...     headline__startswith='What'
    ... ).exclude(
    ...     pub_date__gte=datetime.now()
    ... ).filter(
    ...     pub_date__gte=datetime(2005, 1, 1)
    ... )
    

    文档中包含更多有用的示例:

    【讨论】:

    • 我不相信这种类型的链在这种情况下是可行的。例如,如果我的客户是 XEROX,并且该客户在我有 2 个帐户“copier foo”和“copier bar”。如果“copier bar”是我的搜索词,过滤器会搜索名为“copier bar”的客户,并为辅助帐户过滤器返回一个包含 0 个对象的查询集。将继续搜索文档。格拉西亚斯。
    【解决方案3】:

    重组了视图代码,将客户记录(prdlinks)与账户记录(acclinks)分开并分别处理。不确定它是否会起作用(确实如此),并且仍然不确定这是否是编写代码的最有效方法(可能不是)。无论如何,这是修改后的代码:

    def search_page(request):
            form = PrdSearchForm() 
            prdlinks = []
            **acclinks = []**
            show_results = True 
            if request.GET.has_key('query'): 
                    show_results = True 
                    query = request.GET['query'].strip() 
                    if query:
                            form = PrdSearchForm({'query' : query}) 
                            prdlinks = \
                                    ProjectRecord.objects.filter(client__icontains=query)
                            **acclinks = \
                                    ProjectRecord.objects.filter(account__icontains=query)**
    
            if len(prdlinks) >= 1:
                records = ProjectRecord.objects.filter(client__icontains=query)
                t = get_template('org_list_client.html')
                html = t.render(Context({'records': records}))
                return HttpResponse(html)
    
            **elif len(acclinks) >= 1:
                records = ProjectRecord.objects.filter(account__icontains=query)
                t = get_template('org_list_account.html')
                html = t.render(Context({'records': records}))
                return HttpResponse(html)**
    
            else:
                tpl = "prd_search.html"
                variables = RequestContext(request, { 'form': form, 
                'prdlinks': prdlinks, 
                'show_results': show_results}) 
                return render_to_response(tpl, variables)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多