Django Haystack过滤

时间:2012-10-03 07:13:38

标签: python django django-haystack

我有两个django过滤器,我想用来过滤帖子,但是一个帖子可以有很多类别,所以我把类别放在URL的列表中。现在问题出现了 - 我需要按照帖子的标题和类别进行筛选,但我需要以一种方式进行筛选,这样我就可以检查类别的联合。这是当前的代码:

sqs = SearchQuerySet().all()

if 'title' in request.GET and request.GET['title'] != '':
   sqs = sqs.filter_and(title=request.GET['title'])

if 'category' in request.GET and request.GET['category'] != '':
    catlist = request.GET.getlist('category')

    for i in catlist:
        sqs = sqs.filter_or(category=i)

非常感谢你的帮助!

更多信息:Django 1.4.1,Django-Haystack 1.2.7

编辑:

我做了你的建议(使用__in):

if 'title' in request.GET and request.GET['title'] != '':
   sqs = sqs.filter_and(title=request.GET['title'])

if 'category' in request.GET and request.GET['category'] != '':
    catlist = request.GET.getlist('category')

    sqs = sqs.filter_or(category__in=catlist)

但仍然没有运气 - 我不能按字段和类别搜索。仅按类别搜索似乎有效,但当这两个字段一起输入时,它们不起作用。

1 个答案:

答案 0 :(得分:8)

使用django.db.models.Q和联合作业或__in

sqs.filter(Q(category=i) | Q(category=j))

(您可以在提交到filter之前将Q联合起来)

或使用__in:

sqs.filter(category__in=catlist)

我会在没有链接的情况下命名一些包,因为谷歌搜索它们很简单。

尝试从shell调试和runnig查询。要进行调试,请安装ipdb并在要停止的位置的视图中添加此行。

import ipdb; ipdb.set_trace()

您将在控制台窗口中看到shell(而不是在浏览器中)。在调试shell中键入hhelp。尝试django调试工具栏,它可以帮助调试queires(它有SQL调试面板),在浏览器中工作。

还尝试在shell中进行查询。安装django-extensions并使用shell_plus:

manage.py shell_plus

IPython也会有所帮助。在shell中,尝试运行查询并查看结果。只有当您确定它们按照您的意愿工作时,才将逻辑放在视图中。否则,通过刷新页面进行调试是一条很长的路。

如果您需要以太类别或标题匹配,请执行以下操作:

q = Q()
title = request.GET.get('title'):
if title:
    q |= Q(title__contains=title)  # q = q | Q(...)

if request.GET.get('category'):
    for cat in request.GET.getlist('category'):
        q |= Q(category=cat)

sqs = SearchQuerySet.filter(q)