У меня есть модель, какКак уменьшить количество запросов к БД?
class Node(BaseModel, NodeContent):
__metaclass__ = NodeMetaClass
node_type = models.CharField(max_length=16, default='node')
abs_parent = models.ForeignKey('Node', related_name='all_children', null=True)
... # a lot of other fields
и код, как этот
nodes = Node.objects.filter(node_type='comment')
for node in nodes:
t = node.abs_parent.title
Это работает, но дополнительный запрос выполняется для каждого узла. Я попытался добавить select_related:
nodes = Node.objects.select_related('abs_parent').filter(node_type='comment')
но это не поможет. Что я делаю не так?
Обновление: @SColvin, спасибо вам за отличный метод, он работает! Но на самом деле одного поля для меня недостаточно. Я пытаюсь предоставить код, который будет обрабатывать узлы далее с уже загруженными .abs_parent объектами. Этот код уже написан и ожидает интерфейса типа node.abs_parent. (возможно, с последующим последующим использованием внешних ключей). Я работаю с движком OSQA, и я пытаюсь ускорить его.
Вы должны иметь возможность получить более одного поля значений su_ значений. Кроме того, полезным инструментом для определения использования SQL является удивительная панель инструментов django-debug: http://django-debug-toolbar.readthedocs.org/en/latest/ – Fiver
Я проверил панель инструментов отладки: она уже использовалась в коде, но не был установлен. Я установил его, но получил ImportError: невозможно импортировать имя force_text on from django.utils.encoding import force_text. Я думаю, что я могу жить без него, так как я уже знаю, как записывать необработанные SQL-запросы –