gpt4 book ai didi

python - Django ManyToMany 模板渲染和性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:29:24 25 4
gpt4 key购买 nike

我有一个包含多对多关系的 django 模型,类型为

class MyModel(models.Model):
name = ..
refby = models.ManyToManyField(MyModel2)
..

class MyModel2(..):
name = ..
date = ..

我需要在我的模板中渲染它,以便我能够渲染所有引用 mymodel 的 mymodel2 对象。目前,我做类似下面的事情,

{% for i in mymodel_obj_list %}
{{i.name}}
{% for m in i.refby.all|dictsortreversed:"date"|slice:"3" %}
{{.. }}
{% endfor %}
<div> <!--This div toggles hidden/visible, shows next 12-->
{% for n in i.refby.all|dictsortreversed:"date"|slice:"3:15" %}
{{.. }}
{% endfor %}
</div>
{% endfor %}

正如代码所建议的,我只想显示最新的 3 个 mymodel2 对象,按日期倒序排序,尽管接下来的 12 个对象确实会被加载。

这是一种非常低效的方法吗? (考虑到 refby.all 的结果可能有几百个,而“mymodel_obj_list”中的结果总数也有 100 个——我在那里使用了分页器)。

在这种情况下,预先计算这些 refby 并将它们呈现给模板的最佳方法是什么?是不是应该在 View 中进行排序计算,然后传过去呢?我不确定如何执行此操作以保持我的分页。

查看代码看起来像,

obj_list = Table.objects.filter(..) # Few 100 records
pl = CustomPaginatorClass(obj_list...)

然后我将 pl 作为 mymodel_obj_list 传递给页面。

谢谢!

最佳答案

我假设 mymodel_obj_list 是一个 QuerySet。您正在访问循环内的外键字段,这意味着,默认情况下,当您访问每个对象时,Django 将一次查找每个对象的引用。如果要显示很多行,这会非常慢。

在 QuerySet 上调用 select_related,提前拉入所有这些外键字段。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

关于python - Django ManyToMany 模板渲染和性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com