如何提高n + 1

时间:2019-04-04 07:55:43

标签: django

我有以下内容:

#models:py    
class Author(models.Model):
    name = models.CharField(max_length=20)

class Book(models.Model):
    author = ForeignKey(Author)
    title = models.CharField(max_length=20)

class Comment(models.Model):
    book = ForeignKey(book)
    title = models.CharField(max_length=20)

#views.py
class AuthorBookComment(ListView):
    model = Author
    paginate_by = 5
    template = “template.html”

#template.html  
{% for author in object_list %}
    <h2>{{ author.name }}</h2>
    {% for book in author.book_set.all %}
        <h3>{{book.title}}</h3>
        {% for comment in book.comment_set.all %}
            {{comment.title}}<br/>
        {% endfor %}
    {% endfor %}
{% endfor %}
<<pagination code>>

想法是显示所有作者及其著作和评论(如果有的话)。

挑战: 1.随着数据量增加(SQL请求数= n + 1),性能下降。 2.关于作者集与作者+书+评论集的分页。

问题:如何改善/优化上述内容?

我尝试过各种版本的select_related()和prefetch_related()。返回以下结果,但仍不能提供足够的性能+大数据集。有没有更好的办法?

查询,TimeMs:查询集
230、106:Author.objects.all()
229、105:Author.objects.all()。prefetch_related(book_set')。all()
179、88:Author.objects.all()。prefetch_related('book_set__comment_set')。all()

1 个答案:

答案 0 :(得分:0)

在这些情况下,您应该始终渴望使用select_related()prefetch_related()加载数据。