如何创建一个过滤这样的模型的查询?
我的模特是:
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选项?
我希望我已经说清楚了。谢谢。
答案 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目录。