2016-05-14 149 views
0

我有數據庫中的表,其中包含2或3個字的名稱列表。 所以我希望當用戶在輸入中輸入任何字符串,然後該字符串將被拆分爲字符明智然後每個字符與數據庫中的字符串匹配。atlast哪個字符串匹配用戶字符串的更多字符,結果將根據字符存儲在數組中匹配。它也取決於用戶輸入的字符串模式。如何使用Django在數據庫中搜索數據?

我給大家舉一個例子,我想

在表格下方的名稱都存儲

Neeraj Kumar 
Pankaj Sharma 
Rahul kapoor 

用戶輸入的字符串:

rkp 

那麼結果將是:

1.Rahul Kapoor 
2.Neeraj Kumar 
3.Pankaj Sharam 

原因:

Rahul kapoor has R,K and p which match all character with user string pattern 
Pankaj Sharma has p,k,r which match all characters but its user string patter is wrong so it should be at after above name 
Neeraj Kumar has r and k which match 2 and follow user string pattern 

我想在Django框架這個搜索用更少的代碼,但反正任何人都可以用任何語言給代碼。

我想,這也爲別人讓搜索幫助的更好的

回答

0

iregex獨立篩選QuerySet的情況下,像這樣

Entry.objects.filter(name__iregex=r'[rkp]') 

,將返回所有Entry對象有name任何(因爲[])的字符。

然後你可以在Python中進行排序。

編輯:

這應該這樣做。

names = ['Neeraj Kumar', 'Pankaj Sharma', 'Rahul kapoor'] 
letters = 'rkp' 

# All lower case to be case insensitive 
data = [x.lower() for x in names] 
chars = list('rkp'.lower()) 

# Result groups collectors 
d1, d2, d3 = [], [], [] 

for item in data: 
    # Find the places for all chars in the name 
    indexes = [item.find(c) for c in chars if item.find(c) >= 0] 

    if len(indexes) == len(chars): 
     # All chars found 
     if indexes == sorted(indexes): 
      # Same order as chars 
      d1.append(names[data.index(item)]) 
     else: 
      # Different order 
      d2.append(names[data.index(item)]) 

    elif len(indexes) > 0: 
     # Not all, but some found 
     d3.append(names[data.index(item)]) 

print(d1, d2, d3) 
+0

它提供了更好的過濾數據,但數據順序與串行數據庫中發現的順序相同。如何更改更多字符與輸入字符串匹配的數據順序。 – Amit

+0

我添加了一個腳本到我的答案,排序。 – C14L

+0

我也在腳本中添加腳本,以提供我想要的確切輸出。 – Amit

0
names = ['Neeraj Kumar', 'Pankaj Sharma', 'Rahul kapoor'] 
letters = "rkp" 
# All lower case to be case insensitive 
data = [x.lower() for x in names] 
chars = list(letters.lower()) 

# Result groups collectors 
d1,x= [],[] 
for item in data: 
    indexes = [item.find(c) for c in chars if item.find(c) > 0] 
    d1.append(len(indexes)) 
for i in range(len(names)): 
    if max(d1) != 0: 
     pos = d1.index(max(d1)) 
     x.append(names[pos]) 
     del d1[pos] 
     del names[pos] 
print(x) 

這是更好,因爲當任何清單數據不匹配將不顯示輸入字符串的任何字符,所有的比賽數據存儲在單個列表與匹配字符的順序。