2011-09-26 153 views
3

我有一個模型,我想過濾一個搜索詞,通常是一個名稱。但在我的數據庫first_namelast_name是兩個單獨的字段。django queryset過濾器問題

例如

search_term = 'Will Sm'

db_persons記錄:first_name = 'Will', last_name = 'Smith'

搜索詞就能夠檢索該記錄。

我該如何做到這一點?

db_persons.objects.filter(__?__)

UPDATE:

尋找一種方式來連接字段和查詢連接的結果,而不原始的SQL

+0

可能重複(http://stackoverflow.com/questions/7681708/querying-full-name-in- django) – laffuste

回答

2

一個簡單的解決方案是在模型上添加另一個字段complete_name。在save上,您將通過連接first_namelast_name字段來更新此字段,但不包含任何空格(您需要從拼接結果中除去所有空格)。然後,您將使用search_term在該字段上進行查詢,但空間也被剝離。

簡單的例子來給你的總體思路:在Django查詢全名]

class Person(models.Model): 
    first_name = CharField(...) 
    last_name = CharField(...) 
    complete_name = CharField(...) 

    def save(self, *args, **kwargs): 
     complete_name = '%s%s' % (self.first_name, self.last_name) 
     self.complete_name = complete_name.replace(' ', '') 
     super(Person, self).save(*args, **kwargs) 

results = Person.objects.filter(complete_name__icontains=search_term.replace(' ', '')) 
+0

不敢相信我沒想到......現在我不需要子查詢,謝謝! – zentenk

+0

你也可以詳細說明你在'complete_name'中輸入的內容。這取決於你的用例,但是你可以把'first_namelast_name last_namefirst_name'(例如'WillSmith SmithWill')。您還可以在字段和搜索詞中刪除重音符號和特殊字符。有時候,用這種技巧,你可以得到更好的結果。但這一切都取決於您的用例和數據。我對中文沒有任何經驗。 – Etienne

6

如果你想在第一搜索和姓氏,你可以簡單地使用:

db_persons.objects.filter(first_name='Will', last_name='Smith') 

如果要在first_name或last_name中搜索,請使用Q objects

from django.db.models.query_utils import Q 
db_persons.objects.filter(Q(first_name='will') | Q(last_name='will')) 

更新根據評論:一個簡單的解決辦法是這樣的:

search_string = 'will smith' 
query_list = search_string.split() 
db_persons.objects.filter(Q(first_name__in=query_list) | Q(last_name__in=query_list)) 

如果使用mysql,你可以使用search

+0

但是如果用戶搜索''will smith''會怎麼樣? – zentenk

+1

我用一個簡單的解決方案更新了這個問題。 –

+0

嗯不是我在找的東西,也許是因爲我需要有中文搜索字詞,它們通常沒有空格,也有名字和姓氏。我更多地尋找一種方法來將第一個和最後一個名字連接成別名,並在避免原始sql的同時在這些別名上運行子查詢。 – zentenk