我有两个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)
但仍然没有运气 - 我不能按字段和类别搜索。仅按类别搜索似乎有效,但当这两个字段一起输入时,它们不起作用。
答案 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中键入h
或help
。尝试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)