我有一个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 %}
如代码所示,我只想显示最新的3mymodel2对象,按日期倒序排序,尽管接下来的12个对象会加载。
这样做是不是效率很低(考虑到refby.all的结果可能是几个100秒,而“mymodel_obj_list”中的结果总数也在100秒——我在那里使用了一个分页器)。
在这种情况下,预计算这些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