Django prefetch_related的Prefetch,order_by?

问题描述 投票:2回答:1

我想到了以下查询:

 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排序。这不得影响艺术家对象的顺序。

如何才能做到这一点?

django
1个回答
5
投票

你可以使用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

© www.soinside.com 2019 - 2024. All rights reserved.