如何减少对DB的查询次数?

时间:2013-11-17 13:35:33

标签: django django-orm

我有一个类似

的模型
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引擎,我正试图加速它。

1 个答案:

答案 0 :(得分:2)

我没有Django,所以我无法测试,但你应该可以使用

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

请参阅here

(注意:我假设因为这是“Djangotronic”做事的方式,它应该查询db最少次数,但我不确定。)