Помощь в поисковой форме Django также позволяет выполнять частичный поиск - PullRequest
0 голосов
/ 14 января 2011

У меня есть поиск, который ищет alternate_id для определенного элемента. Этот поиск может позволить альтернативу, если сделать несколько поисков, если есть запятая без пробелов. Но я хочу, чтобы моя форма поиска также могла выполнять «частичный поиск». Поэтому поиск *, 2ndid даст все результаты ......, 2ndid

Альтернативный идентификатор - это строка. Не целое число Единственная причина, по которой я получил значение __in, заключалась в том, что я мог выполнять несколько поисков.

def search_item(request, client_id = 0):
    client = None
    if client_id != 0:
        try:
            client = models.Client.objects.get(pk = client_id)
        except:
            pass

        items = None
        Q_alt_ids = Q()
        if request.method == 'POST':
             form = forms.SearchItemForm(request.POST)
             if form.is_valid():
             alternate_id = form.cleaned_data['alternate_id']
             items = client.storageitem_set.all()
       if alternate_id:
                alternate_ids= alternate_id.lower().split(",")
                Q_alt_ids = Q(alternative_id__in = alternate_ids)
        return render_to_response('items.html', {'items':items, 'client':client}, context_instance = RequestContext(request))
 else:
        HttpResponse(client)
        if client is not None:
            form = forms.SearchItemForm(initial = {'client':client.pk})
        else:
            form = forms.SearchItemForm()
    return render_to_response('search_items.html', {'form':form}, context_instance = RequestContext(request))

Ответы [ 2 ]

1 голос
/ 15 января 2011

Помимо написания собственного SQL, я думаю, что единственное готовое решение, которое может обрабатывать надежный запрос, такой как подстановочный знак, это регулярное выражение. Если подстановочный знак всегда находится в одном и том же месте, например, за которым следует неполная строка, вы можете использовать тип поиска field__startswith=partial.

Но в целом, подстановочные знаки = регулярное выражение

http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex

НО, У меня есть подозрение, что вы ищете тип поиска фильтра contains или icontains.

Если вы хотите сопоставить 'привет', 'элло', 'мир' в 'привет мире':

# first split the string by comma
queries = form.cleaned_data.get('query', '').split(',')

# populate queries list
query_list = [Q(**{'alternative_id__icontains' : query }) for query in queries]

# join queries list with the OR operator
results = MyModel.objects.filter(  reduce(operator.or_, query_list)  )
0 голосов
/ 25 января 2011

спасибо Юджи за ответ.Эти изменения необходимы, чтобы заставить его работать.

 return_all = False
    filters = []
                 if alternate_id:
                    alternate_ids = alternate_id.lower().split(",") 
                    for item in alternate_ids:
                    if '*' not in item:
                        filters.append( Q(alternative_id=item) )
                    elif item == '*':
                        return_all = True
                    elif item.startswith('*') and item.endswith('*'):
                        filters.append( Q(alternative_id__icontains=item.strip('*')) )
                    elif item.startswith('*'):
                        filters.append( Q(alternative_id__endswith=item.strip('*')) )
                    elif item.endswith('*'):
                        filters.append( Q(alternative_id__startswith=item.strip('*')) )
                    else:
                        assert False, "Wildcard in invalid position (valid is.. *XX, *XX*, XX*)"

if not filters or return_all:
    items = items.all()
else:
    items = items.filter(reduce(operator.or_, filters))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...