python-Django ManyToMany模板渲染和性能问题
作者:互联网
我有一个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”中的结果总数也为100s-我在那里使用了分页器).
在这种情况下,最好的方法是预先计算这些refby并将它们呈现到模板中?我应该在视图中进行排序和计算,然后再通过它吗?我不确定如何保持分页.
查看代码看起来像这样,
obj_list = Table.objects.filter(..) # Few 100 records
pl = CustomPaginatorClass(obj_list...)
然后将pl作为mymodel_obj_list传递到页面.
谢谢!
解决方法:
我假设mymodel_obj_list是一个QuerySet.您正在循环中访问外键字段,这意味着,默认情况下,Django在访问对象时会一次查找每个对象的refby.如果要显示很多行,这将非常慢.
在QuerySet上调用select_related,以预先提取所有这些外键字段.
https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related
标签:performance,many-to-many,django-templates,python,django 来源: https://codeday.me/bug/20191107/2003453.html