связанные элементы в цикле создает много повторяющихся запросов - PullRequest
0 голосов
/ 15 мая 2019

Отображение страницы становится очень медленным, когда в шаблоне запрашиваются связанные объекты.

class Item(models.Model):
   name =  models.CharField(max_length=160)
   ...

class Box(models.Model):
   ...
   items = models.ForeignKey(Item, on_delete=models.CASCADE, null=True) 

#template  
{% for item in items %}  
   {{ item.box_set.first }}  
   {{ item.box_set.latest }}  
{% endfor %}

Панель инструментов отладки показывает много повторяющихся запросов.Почему это происходит?Есть ли способ ускорить это?

1 Ответ

1 голос
/ 15 мая 2019

Django ORM должен сделать запрос к базе данных при доступе к связанному полю, если оно уже не кэшировано. Основные способы кеширования связанных объектов: select_related и prefetch_related.

То, что вы пытаетесь сделать, немного сложнее; вы пытаетесь получить два конкретных элемента из коллекции. Вы можете использовать .annotate() и Subquery для извлечения единичных полей из связанной модели. Это было бы полезно, если вы просто хотите отобразить одно поле из ящика, но если вам нужен весь экземпляр ящика, это не сработает.

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