2

我有两个 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)

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

4

1 回答 1

8

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

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

(您可以在提交之前合并 Q filter

或使用 __in:

sqs.filter(category__in=catlist)

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

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

import ipdb; ipdb.set_trace()

您将在控制台窗口(而不是浏览器)中看到 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)
于 2012-10-03T08:03:22.953 回答