2013-11-17 5 views
0

У меня есть модель, какКак уменьшить количество запросов к БД?

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, и я пытаюсь ускорить его.

+0

Вы должны иметь возможность получить более одного поля значений su_ значений. Кроме того, полезным инструментом для определения использования SQL является удивительная панель инструментов django-debug: http://django-debug-toolbar.readthedocs.org/en/latest/ – Fiver

+0

Я проверил панель инструментов отладки: она уже использовалась в коде, но не был установлен. Я установил его, но получил ImportError: невозможно импортировать имя force_text on from django.utils.encoding import force_text. Я думаю, что я могу жить без него, так как я уже знаю, как записывать необработанные SQL-запросы –

ответ

2

у меня нет Django, поэтому я не могу проверить это, но вы должны быть в состоянии использовать

node = Node.objects.filter(node_type='comment') 
node_titles = nodes.values_list('abs_parent__title', flat=True) 

См here

(Примечание: Я предполагаю, так как это " Djangotronic ", он должен запрашивать db минимальное количество раз, но я точно не знаю.)

Смежные вопросы