我想到了以下查询:
context['user_artists'] = Artist.objects.filter(users=current_user).all()
结合模板中的以下用法:
{% if user_artists %}
...
{% for artist in user_artists %}
....
<p class="small">last release: {{ artist.release_groups.last.title }}</p>
<p class="small">date: {{ artist.release_groups.last.release_date }}</p>
在查询中为每位艺术家敲击数据库3次。我知道这可以通过在模板中简单保存.last
来降低到2,但仍然不够快。
我知道我可以这样使用prefetch_related
:
Artist.objects.filter(users=current_user).prefetch_realted(`release_groups`).all()
而且我还需要消除他对.last
的使用,因为它意味着另一个查询。我可以使用模板引擎的slice
方法来获取最后一个元素。但后来我必须订购相关的关系:意思是,在我在模板中访问它们之前,我需要release_group
按自己的release_date
排序。这不得影响艺术家对象的顺序。
如何才能做到这一点?
你可以使用Prefetch
:
Artist.objects.prefetch_related(Prefetch('release_groups', queryset=ReleaseGroup.objects.order_by('release_date')))
为避免与名称冲突,您可以将to_attr
设置为其他名称:
Artist.objects.prefetch_related(Prefetch('release_groups', queryset=ReleaseGroup.objects.order_by('release_date'), to_attr='rgs')).all()
然后,您可以访问模板中的每个缓存版本组,如下所示:
artist.rgs.0.title