Django Cross Filter搜索?

时间:2012-01-07 18:21:55

标签: django

如何创建一个过滤这样的模型的查询?

我的模特是:

class test(models.Model):
    name = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
    other = models.CharField(max_length=50)

我想这样而不是OR我用AND过滤查询。我试过更改|到&但它不起作用。为了使它更复杂,如果我在模板上有过滤器作为一个表单,以便:

Filter By Name: DropDownList of Names
Filter By Status: DropDownList of Statuses
Filter By Other: DropDownList of Others

如果我从下拉框中选择name1,status1和other1,它应显示以下结果:

results = test.objects.filter(name=name1,status=status1,other=other1)

这是我在views.py中的当前查询:

def search(request):
    query = request.GET.get('q', '')
    if query:
        qset = (
            Q(name__icontains=query) |
            Q(status__icontains=query) |
            Q(other__icontains=query)
        )
        results = test.objects.filter(qset).distinct()
    else:
        results = []
    return render_to_response("test/search.html", {
        "results": results,
        "query": query
    })

目前仅搜索姓名,状态或其他内容。如果我改变了|到&它会搜索所有这些,但是当我显示结果时没有显示,因为表单下拉框中的查询处理没有链接。如何链接他们?如何为特定字段的下拉菜单提供ALL选项?

我希望我已经说清楚了。谢谢。

1 个答案:

答案 0 :(得分:2)

我建议您查看django-filters应用程序。它可以通过表单下拉菜单自动化所有例程,并通过搜索/过滤查询生成查询集:

  

Django-filter是一个可重用的Django应用程序,允许用户使用   动态过滤查询集。它需要Python 2.4或更高版本。对于   使用和安装说明请参阅docs目录。

     

Django-filter可用于生成类似于的接口   Django admin的list_filter界面。它的API非常相似   到Django的ModelForms。例如,如果您有产品型号   您可以使用代码::

为它设置过滤器
import django_filters

class ProductFilterSet(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = ['name', 'price', 'manufacturer']
     

然后在你看来你可以做::

def product_list(request):
    filterset = ProductFilterSet(request.GET or None)
    return render_to_response('product/product_list.html',
        {'filterset': filterset})
     

有关详细信息,请参阅docs目录。