【问题标题】:django search using raw mysql使用原始 mysql 进行 django 搜索
【发布时间】:2018-03-02 21:13:23
【问题描述】:

我正在尝试创建一个具有 4 个搜索字段的自定义搜索引擎。我想在mysql表里面搜索。

这是我的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中的任何title_search得到的错误

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

在过去的一周里,我一直试图让这个搜索工作,我一直在询问它......使用不同类型的方法。例如:elasticsearch、haystack 等...

更新

我确实像你说的那样修改了views.py。而且我没有再收到任何错误...但我也没有得到任何结果。

这是我的 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 %}

我只做了title_search...在我得到标题修复后我要做的另一个..它们就在html中。 请帮助我修复此搜索引擎 提前谢谢你

【问题讨论】:

    标签: python html mysql django


    【解决方案1】:

    qNone

    需要处理q不在request.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 = []
    

    您的输入名称为Title,但您在request.GET 中查找q。您要么需要将输入命名为“q”,要么在request.GET 中查找“Title”

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

    【讨论】:

    • 谢谢...它不再给我任何错误...但是当我搜索标题时它没有给我任何结果。我将使用 table_list.html 代码更新我的问题
    • 更新了我的答案——你应该真正使用 Django 表单而不是手工制作它们,你应该真正使用 ORM 而不是执行原始查询
    • 出于某种原因..我的 request.GET.get 不起作用...我使用 print 查看打印出的内容...并打印出 None。我想要你的 Django 表单……但我一直在寻找一些答案来让它以这种方式工作……我找不到任何答案……关于制作动态模型
    猜你喜欢
    • 2013-05-04
    • 2012-04-16
    • 1970-01-01
    • 2019-11-16
    • 2021-10-03
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多