Django ManyToMany Шаблон рендеринга и проблемы с производительностью - PullRequest
3 голосов
/ 14 июля 2009

У меня есть модель django, которая содержит множество отношений типа

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

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

Мне нужно отобразить его в моем шаблоне так, чтобы я мог отображать все объекты mymodel2, которые ссылаются на mymodel. В настоящее время я делаю что-то вроде следующего,

{% 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 и рендеринга их в шаблон? Должен ли я выполнить сортировку и вычисление в представлении, а затем передать его? Я не был уверен, как это сделать, чтобы сохранить свою нумерацию страниц.

Вид кода выглядит примерно так:

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

И я передаю pl на страницу как mymodel_obj_list.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 14 июля 2009

Полагаю, mymodel_obj_list - это QuerySet. Вы получаете доступ к полю внешнего ключа внутри цикла, что означает, что по умолчанию Django будет искать по одному refby каждого объекта, когда вы обращаетесь к нему. Если вы отображаете много строк, это очень медленно.

Вызовите select_related в QuerySet, чтобы заранее получить все эти поля внешнего ключа.

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

0 голосов
/ 14 июля 2009

Должен ли я сделать сортировку и вычисление в представлении, а затем передать это? * * 1002

Да, определенно.

Это не вопрос производительности (так как наборы запросов Django лениво оцениваются, я подозреваю, что конечная производительность может быть очень похожей в обоих случаях), а организация кода Шаблоны не должны содержать никакой бизнес-логики, только представление. Конечно, иногда эта модель выходит из строя, но в целом вы должны постараться как можно больше придерживаться этого направления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...