2011-01-14 2 views
-1

特定のアイテムのalternate_idを探す検索があります。この検索で​​は、空白のないカンマがある場合に複数の検索を行う代わりにifを使用できます。しかし、私は自分の検索フォームが「部分検索」もできるようにしたい。したがって、*を検索すると、2ndidはすべての結果を返します。......、2ndidDjango検索フォームのヘルプで部分検索もできるようにしたい

代替IDは文字列です。整数ではありません。 __inとして私が持っている唯一の理由は、私は複数の検索を行うことができたからです。別に独自のSQLを書いてから

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)) 

答えて

-1

おかげ裕二:

あなたは 'こんにちは'、 'ello'、 'こんにちは世界で '世界' を一致させたい場合は

。これらの変更は、動作させるために必要です。

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)) 
1

、私はワイルドカードのような強力なクエリを処理することができる唯一のアウトボックスソリューションは、正規表現だと思います。ワイルドカードが常に同じ場所にある場合(たとえば、部分文字列が続いた場合など)、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

私の意見を編集してください。私はファイルを編集するのが難しいと思っています。 – Shehzad009

+0

これはメールで解決しました。私はあなたを無視したように見せたくありません。 :P –