编程语言
首页 > 编程语言> > python-Django ManyToMany模板渲染和性能问题

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