我在从数据库中检索数据时遇到问题, 我正在使用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)
这也是一样的,我需要更快地加载数据。请向我建议任何可以加快数据加载的方法。
答案 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文档中找到更多详细信息。