[英]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中鍵入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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.