2012-01-25 91 views
6

我有一個django應用程序,可以從單個用戶表中檢索所有主題。我還實施了一個輸入搜索表單, 這是執行的查詢:django queryset - 搜索名字和姓氏

all_soggs =  Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname') 
if(all_soggs.count()==0): 
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname') 

,你可以看到查詢首先搜索通過姓氏配套項目,然後由名字。這工作,直到我插入完整的名字'firstaname lastname'或'姓氏firstname',在這種情況下,沒有結果。我如何修改查詢來進行更好的搜索?

感謝盧克 -

回答

8

複製/粘貼:https://stackoverflow.com/a/17361729/1297812

from django.db.models import Q 

def find_user_by_name(query_name): 
    qs = User.objects.all() 
    for term in query_name.split(): 
    qs = qs.filter(Q(first_name__icontains = term) | Q(last_name__icontains = term)) 
    return qs 
+1

已經解決了(超過1年前)。無論如何感謝:-) – Luke

7

You need Q objects,您還需要分割查詢到單獨的條款(因爲沒有名字將匹配滿弦「姓」)。

這裏有一個想法,以配合或者「名字」或「姓氏」中尋「姓」開始的任何名字或姓氏。

這是一個通用搜索 - 調整查詢,以滿足您的特定需求!

編輯:哎呀,我真的不喜歡使用減少,因爲它看起來混亂,但這些都需要相或聚在一起,我們不能做一個更詳細的版本,因爲項的數量是未知的。

import operator 
from django.db.models import Q 

search_args = [] 
for term in request.GET['query_term'].split(): 
    for query in ('first_name__istartswith', 'last_name__istartswith'): 
     search_args.append(Q(**{query: term})) 

all_soggs = Entity.objects.filter(reduce(operator.or_, search_args)) 

要闡明如何用Q對象,給出搜索 「姓」 以前的查詢等於:從

Entity.objects.filter(
    Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") | 
    Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname") 
    ) 
0

類似問題:Querying full name in Django

query = request.GET.get('query') 
entities = [] 

try: 
    firstname = query.split(' ')[0] 
    lastname = query.split(' ')[1] 
    entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname) 
    entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname) 

entities = set(entities) 
+0

回答問題兩次並引用您自己的答案有什麼意義? –

+0

根據你得給,即使你是引用鏈接完整的答案堆棧溢出的規則,因爲鏈接可能會破產 – atx