Django从数据库检索数据到模板

时间:2016-05-12 13:52:21

标签: mysql django

我在从数据库中检索数据时遇到问题, 我正在使用Mysql数据库和一个包含15个字段的表,我将在表格中的模板上显示它。

表中有超过400万条记录,

def index(request):
    args = {}
    data = Mymodel.objects.all()
    args['data'] = data
    return render(request, 'index.html', args)

我试过这种方式,但数据加载非常缓慢,

以及我为数据库连接尝试的下一个方法

def index(request):
    args = {}
    sql = "select * from mymodel"
    cursor = connection.cursor()
    cursor.execute(sql)
    result = cursor.fetchall()
    args['result'] = result
    return render(request, 'index.html', args)

这也是一样的,我需要更快地加载数据。请向我建议任何可以加快数据加载的方法。

3 个答案:

答案 0 :(得分:1)

解决方案之前的一个概念修正是使用原始sql并不比django ORM做得更好,你也失去了使用ORM api轻松显示数据的能力。

常见的解决方案是使用内置分页的django来显示每页的一定数量的记录。 Django doc对分页的使用有非常详细的解释。

答案 1 :(得分:1)

由于您已经在执行原始查询,因此我认为您不会比您拥有的更好。

你有什么理由不能对结果进行分页吗?通常,您永远不会返回所有可用数据。

您可以尝试使用QuerySet.iterator,以避免必须立即将所有实例加载到内存中。此外,QuerySet.values将返回字典而不是完整的模型实例,从而减少内存使用。

如果您确实需要并且进入请求超时,则可以选择在后台运行实际数据检索。例如,您可以使用Celery并将查询作为任务的一部分运行。您的视图将触发Celery任务并在响应中返回任务标识符。然后,消费者可以轮询传递此类任务ID的“作业状态”端点,并在它们准备好时检索结果。您仍然需要将结果存储在比数据库更快的其他地方(更快),即Redis(您可以轻松地将其用作Celery后端)。

这种方法显然更复杂,并且会为您的系统添加一些移动部件,并且您可能会遇到其他问题(例如响应大小)。如果可能的话,使用分页会更容易。

答案 2 :(得分:1)

如果您希望系统能够处理数千条记录,则可以使用分页。 Django genaric ListView将在这种情况下帮助您。它们易于使用。他们像这样工作

class YourView(ListView):
    template_name = 'books/acme_list.html'
    context_object_name = 'object_list'
    queryset = TableName.objects.all()
    paginate_by = 50

您的模板将是这样的

<table id="exam">
  {% for object in object_list %}
  <tr>
    <td>{{ object }}</td>
  </tr>
  {% endfor %}
</table>

您的分页部分将是这样的

{% if is_paginated %}
  <ul class="pagination">
    {% if page_obj.has_previous %}
      <li>
         <span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span>
     </li>
    {% endif %}
      <li class="">
        <span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
      </li>
    {% if page_obj.has_next %}
      <li>
        <span><a href="?page={{ page_obj.next_page_number }}">Next</a></span>
      </li>
    {% endif %}
      </ul>
{% endif %}

您可以在此link和Django文档中找到更多详细信息。

相关问题