Django中页面加载非常缓慢

3
您好,我有一个网络项目正在托管,问题是一个特定页面加载非常慢。原因可能是我猜测的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

2
分享你的Lecture模型和视图,这很可能是著名的N+1问题 - Willem Van Onsem
1
考虑使用 Django Debug 工具栏(https://django-debug-toolbar.readthedocs.io/en/latest/)来检查渲染此视图所执行的 SQL 查询数量。 - Paweł Kordowski
特别是lec.lecture.alllec.lecturerlec.faculty应该进行优化。我也不确定为什么需要JavaScript来处理它。例如,如果您想使表格更具动态性,则最好呈现表格,并让JavaScript处理表格。如果负载真的太大而无法获取“页面”,则使用AJAX查询可能更好。但是1,200并不多,所以我认为这些在这里不是必要的。 - Willem Van Onsem
我对AJAX不是很熟悉,因此我使用JS,但如果AJAX是唯一的解决方案,那么我必须学习它。 - Ekrem Üçüncü
@EkremÜçüncü:lec.lecturer是从哪里得来的(以及lec.facultylec.lecture.all呢?这些在您的模型中并未出现,但很可能会导致效率低下。您能添加对应的模型/关系吗? - Willem Van Onsem
我添加了错误的(讲座)模型,现在我添加了讲师模型。 - Ekrem Üçüncü
1个回答

4

这是一个常见的 N+1 问题,您在一个数据库查询中获取了所有的 Lecturer,但是对于每个 Lecturer,您都需要进行额外的查询来获取与之相关联的 lecture 对象和 faculty 对象。

您可以使用 .select_related(…) [Django-doc] 来优化一对一关系和多对一关系,并且使用 .prefetch_related(…) [Django-doc] 来优化一对多关系和多对多关系。因此,在这里您可以使用以下代码:

class Index(generic.ListView):
    template_name='home.html'
    model = Lecturer
    context_object_name = 'lecture_list'
    queryset = Lecturer.objects<b>.select_related(
        'faculty'
    ).prefetch_related('lecture').order_by('lecturer')</b>

因为这是一个ListView,所以没有必要自己将查询集添加到上下文中,您可以使用context_object_name属性[Django-doc]来指定传递查询集的变量名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接