簡體   English   中英

Django Haystack過濾

[英]Django Haystack filtering

我有兩個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)

但仍然沒有運氣 - 我不能按字段和類別搜索。 僅按類別搜索似乎有效,但當這兩個字段一起輸入時,它們不起作用。

使用django.db.models.Q和union操作或__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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM