Django prefetch_related的Prefetch,order_by?

零对冲

我想到了以下查询:

 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章