2

投稿を除外するために使用したい2つのdjangoフィルターがありますが、1つの投稿に多くのカテゴリを含めることができるため、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)

しかし、それでもうまくいきません。フィールドやカテゴリで検索することはできません。カテゴリのみの検索は機能しているようですが、これら 2 つのフィールドを一緒に入力すると機能しません。

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)

グーグル検索は簡単なので、リンクせずにいくつかのパッケージに名前を付けます。

シェルからクエリをデバッグして実行してみてください。デバッグするには、ipdb をインストールし、ビューの停止したい場所にこの行を追加します。

import ipdb; ipdb.set_trace()

(ブラウザではなく) コンソール ウィンドウにシェルが表示されます。デバッグ シェルでhorと入力します。helpdjango デバッグ ツールバーを試してみてください。クエリのデバッグに役立ちます (SQL デバッグ パネルがあります)。ブラウザで動作します。

また、シェルでクエリを作成してみてください。django-extensions をインストールし、shell_plus を使用します。

manage.py shell_plus

IPython も役立ちます。シェルでクエリを実行して、結果を確認します。意図したとおりに機能することが確実な場合にのみ、ロジックをビューに配置します。それ以外の場合、ページを更新してデバッグするのは非常に長い道のりです。

一致するカテゴリまたはタイトルが必要な場合は、次のようにします。

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 に答える