Django-如何以一种我可以在模板上迭代的有效方式获得最新的相关模型?

Django-如何以一种我可以在模板上迭代的有效方式获得最新的相关模型?,django,database,performance,django-models,django-templates,Django,Database,Performance,Django Models,Django Templates,假设我有两个相关的模型,其中一个带有datetime字段。 (作者和带有出版日期的书) 我想展示一个作者列表,以及他们各自写的最新著作。 我在作者模型上做了一个方法: def get_latest_book(self): return self.books.all().latest('pub_date') 这是可行的,但在模板上渲染时效率很低: views.py: class AuthorListView(ListView): model = Author templa

假设我有两个相关的模型,其中一个带有datetime字段。 (作者和带有出版日期的书)

我想展示一个作者列表,以及他们各自写的最新著作。 我在
作者
模型上做了一个方法:

def get_latest_book(self):
    return self.books.all().latest('pub_date')
这是可行的,但在模板上渲染时效率很低:

views.py:

class AuthorListView(ListView):
    model = Author
    template_name = 'author_list.html'

    def get_queryset(self):
        return self.model.objects.filter(owner=self.request.user).order_by('name').prefetch_related('books')
author_list.html:

...
{% for author in author_list %}
Name: {{author.name}} - Latest publication: {{author.get_latest_book}}
{% endfor %}
...
这将生成大量查询,如:

SELECT ••• FROM `app_book` WHERE `app_book`.`author_id` = 374 ORDER BY `app_book`.`pub_date` DESC LIMIT 1
  36 similar queries. 
对于数据库中的每个作者! 这将导致图书列表的巨大加载时间


如何在模板上高效打印作者及其最新著作的列表?

提高效率的简单方法是:

从django.db.models导入预取
类AuthorListView(ListView):
模型=作者
模板名称='author\u list.html'
def get_queryset(自我):
返回self.model.objects.filter(
所有者=self.request.user
).prefetch_相关(
将('books',Book.objects.order_by('-pub_date')预取到\u attr='books\u ordered')
).order_by('name')
然后使用以下命令渲染此内容:

{% for author in author_list %}
    Name: {{author.name}} - Latest publication: {{ author.books_ordered.0 }}
{% endfor %}
{作者列表%中的作者百分比}
名称:{{author.Name}-最新出版物:{{author.books\u ordered.0}
{%endfor%}

不过,这将加载内存中的所有相关书籍,但只需一次查询。

谢谢您的回答,它有效地减少了我的查询和加载时间。我唯一不清楚的是您的最后一句话:在一个查询中加载内存中所有相关项是一件坏事吗?为了获得最佳性能,我应该使用什么?@Willem,你认为这个:Book.objects.all().order_by('author','-pubdate')。distinct('author')。除非数据库不接受distinct,否则它将不起作用。@EricMartin:据我所知,Django只对PostgreSQL数据库执行此操作(这可能是唯一支持这一点的数据库),但它还不包括尚未出版任何书籍的作者。
{% for author in author_list %}
    Name: {{author.name}} - Latest publication: {{ author.books_ordered.0 }}
{% endfor %}