【发布时间】:2021-01-13 08:26:01
【问题描述】:
您好,我正在托管一个 web 项目,问题是特定页面的加载速度非常慢。 原因是我猜测我正在迭代讲座的 Jquery 代码,我有超过 1200 个讲座。我通常会显示所有讲座并通过搜索过滤它们,然后我认为如果我什么都不显示并且只在有人搜索但仍然很慢时显示它会更快。这是我的html。提前谢谢你。
html
{% extends "base.html" %}
{%block content%}
{% load crispy_forms_tags %}
<div class="container"><h1 style="text-align:center;">Not Dağılımları</h1>
<hr>
</div>
<div class="container">
<div class="form-group pull-right">
<input type="text" class="search form-control" placeholder="Ara">
</div>
<span class="counter pull-right"></span>
<table style="background-color:white;"class="table table-hover results">
<thead>
<tr>
<th >Hoca</th>
<th>Fakülte</th>
<th >Ders</th>
</tr>
<tr class="warning no-result">
<td><i class="fa fa-warning"></i> Sonuç Yok</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<script>
$(document).ready(function(){
$(".search").keyup(function () {
$('tbody').find('tr').remove();
var searchTerm = $(".search").val().toLowerCase();
if (searchTerm.length>2){
list=[]
{%for lec in lecturer_list%}
if( '{{lec}}'.toLowerCase().includes(searchTerm)){
$('tbody').append('<tr><td><p><a style="text-decoration:none;color:#002855;" href="{% url 'distribution:lecturer_distribution' slug=lec.slug%}">{{lec.lecturer}}</a></p></td><td><p>{{lec.faculty}}</p></td><td style="color:white;">{%for ders in lec.lecture.all%}<a style="text-decoration:none;color:#002855;" href="{% url 'distribution:lecture_distribution' slug=ders.slug%}">{{ders.lecture}}</a>,{% endfor%}</td></tr>');
}
{%endfor%}
}
});
});
</script>
{% endblock content%}
编辑 这是我的讲师模型
class Lecturer(models.Model):
lecturer=models.CharField(max_length=128,blank=False)
lecture=models.ManyToManyField(Lecture,blank=True)
faculty=models.ForeignKey('Department', on_delete=models.CASCADE, related_name='department_for_lecturer')
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.lecturer)
super().save(*args, **kwargs)
def get_lectures(self):
return ",".join([str(p) for p in self.lecture.all()])
def __str__(self):
return self.lecturer
class Meta:
ordering = ['lecturer']
views.py
class Index(generic.ListView):
template_name='home.html'
models=Lecturer
queryset = Lecturer.objects.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context ['lecturer_list'] = Lecturer.objects.order_by('lecturer')
return context
【问题讨论】:
-
分享您的
Lecture模型和视图,这可能是著名的N+1 问题。 -
考虑使用 Django 调试工具栏 (django-debug-toolbar.readthedocs.io/en/latest) 检查为呈现此视图而执行的 SQL 查询数
-
尤其应该优化
lec.lecture.all、lec.lecturer和lec.faculty。我也不相信为什么你需要在这里使用 JavaScript 来处理它。例如,如果您想让表格更加动态,最好渲染表格,并让 JavaScript 处理表格。如果负载真的太多而无法获取“页面”,那么使用 AJAX 查询可能会更好。但是1'200并不多,所以我认为这里没有必要。 -
我对AJAX不是很熟悉,因为我用过JS,但是如果AJAX是唯一的解决方案,那么我必须学习它。
-
@EkremÜçüncü:
lec.lecturer来自哪里(以及lec.faculty和lec.lecture.all?这些没有出现在您的模型中,但可能是效率低下的原因。您可以添加相应的模型吗? /关系?
标签: javascript python html jquery django