2017-09-21 21 views
0

私は4つの検索フィールドでカスタム検索エンジンを作成しようとしています。私はmysqlテーブル内を検索したい。raw mysqlを使ったdjangoの検索

これは、検索、ページ付けのためのviews.pyの一部であり、テーブルデータ全体をリストします。

def addview(request, table_id): 
    try: 
     table_name = Crawledtables.objects.get(id=table_id) 

     tbl_details = "SELECT * FROM " + table_name.name 
     tbl_detail = AllTables.objects.raw(tbl_details) 

     paginator = Paginator(list(tbl_detail), 100) 
     page = request.GET.get('page') 

     try: 
      details = paginator.page(page) 
     except PageNotAnInteger: 
      details = paginator.page(1) 
     except EmptyPage: 
      details = paginator.page(paginator.num_pages) 

     q = request.GET.get("q") 
     title_search = """SELECT * FROM """ + table_name + """ WHERE `Title` LIKE '\%""" + q + """\%' """ 
     # title_search = """SELECT id,description, MATCH (title) AGAINST (""" + q + """ IN BOOLEAN MODE) " \ 
     #    FROM """ + table_name + """ ORDER BY id DESC;""" 
     search_title = AllTables.objects.raw(title_search) 

     return render(request, 'tables/table_list.html', {'tbl_name': table_name, 
                  'details': tbl_detail, 
                  'search': search_title, 
                  'detail_page': details}) 
    except AllTables.DoesNotExist: 
     raise Http404() 

、これは動的テーブルクラスと私のmodels.pyの一部です。

@python_2_unicode_compatible 
class AllTables(models.Model): 
    title = models.TextField(db_column='Title', blank=True, null=True) 
    url = models.CharField(db_column='Url', unique=True, max_length=250, blank=True, 
          null=True) 
    description = models.TextField(db_column='Description', blank=True, null=True) 


    class Meta: 
     managed = False 

    def __str__(self): 
     return self.url 

    def __unicode__(self): 
     return self.title 

私は私が過去一週間のために働いて、この検索を取得しようとしてきたviews.py

Traceback (most recent call last): 
    File "/home/omega/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner 
    response = get_response(request) 
    File "/home/omega/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/omega/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/srv/tester/tables/views.py", line 52, in addview 
    title_search = """SELECT * FROM """ + table_name + """ WHERE `Title` LIKE '\%""" + q + """\%' """ 
TypeError: coercing to Unicode: need string or buffer, NoneType found 

からtitle_searchのいずれかを使用して取得し、私が求めていましエラーそれについて...さまざまなタイプのメソッドを使用しています。例:elasticsearch、干し草、等...

UPDATE

私はあなたが言ったようにviews.pyを変更しませんでした。私はもうエラーは表示されません...しかし、私はどんな結果も得られません。

これは彼らはただそこにある..私は唯一title_search ...私はタイトルの修正を取得した後に何をするつもり他の1つのIMをした私のtable_list.html

<h3>Search Engine</h3> 

<form class="navbar-form navbar-left" role="search" method="get" action="{% url 'tables:details' table_id=tbl_name.id%}"> 
    <div class="form-group"> 
     <input placeholder="Title" type="text" class="form-control" name="Title" value=""> 
     <input placeholder="Url" type="text" class="form-control" name="Url" value=""> 
     <input placeholder="Description" type="text" class="form-control" name="Description" value=""> 
    </div> 
    <button type="submit" class="btn btn-default">Search</button> 
</form> 
     <p>You searched for open sections of: <strong>{{ query }}</strong></p> 
{% if search %} 
    <p>Found {{ search|length }} section{{ search|pluralize }}.</p> 
    <ul> 
     {% for section in search %} 
      <li>{{ section.title }}</li> 
      <li>{{ section.url }}</li> 
      <li>{{ section.description }}</li> 
     {% endfor %} 
    </ul> 
{% else %} 
    <p>No open sections found.</p> 
    {% endif %} 

の一部です。 html。 この検索エンジンの修正 を得ることに私を助けてくださいあなたはqrequest.GET

q = request.GET.get("q") 
if q is not None: 
    title_search = """SELECT * FROM """ + table_name + """ WHERE `Title` LIKE '\%""" + q + """\%' """ 
    # title_search = """SELECT id,description, MATCH (title) AGAINST (""" + q + """ IN BOOLEAN MODE) " \ 
    #    FROM """ + table_name + """ ORDER BY id DESC;""" 
    search_title = AllTables.objects.raw(title_search) 
else: 
    search_title = [] 

ご入力されていない場合を処理する必要が名前を持っている

答えて

1

qNone

で事前にありがとうTitleですが、qrequest.GETに探しています。あなたのいずれかを入力し、「Q」という名前を付けたりrequest.GET

q = request.GET.get("Title") 
+0

に「タイトル」を探す必要があり、それは私にこれ以上のエラーを与えるものではありません...ありがとう...しかし、それは私に何も結果を与えるものではありません私がタイトルを検索するとき。私はあなたの質問をtable_list.htmlコードで更新しようとしています – Omega

+0

私の答えを更新しました。手作業ではなくDjangoフォームを実際に使うべきです。何らかの理由で生のクエリ –

+0

を実行するのではなくORMを使うべきです。 GET.getは動作していません...私はプリントを使って何がプリントアウトされているかを見て、プリントアウトします。私はあなたにDjangoのフォームが欲しかった...しかし、私はそれをこのように働かせるためにいくつかの答えを探していた...と私は答えを見つけることができませんでした.... – Omega