2016-05-14 2 views
0

У меня есть таблица в базе данных, которая содержит список имен с 2 или 3 словами. Таким образом, я хочу, чтобы при вводе пользователем любой строки во входной строке эта строка была разделена на символ, а затем каждый символ соответствовал String в базе данных. В строке, в которой строка соответствует более символу строки User, результат будет храниться в массиве в соответствии с символом match.It также зависит от пользовательской строки строки ввода.Как искать данные в базе данных с помощью 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 с любым (becaue []) персонажей.

Затем вы можете выполнить сортировку в Python.

EDIT:

Это должно сделать это.

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) 

Это лучше, потому что, когда все данные, список не соответствует любому символу из строки ввода, который не будет отображаться и все данные матча сохраняются в одном списке с порядком соответствующих символов.

Смежные вопросы