我有一个类似
的模型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 :(得分:2)
我没有Django,所以我无法测试,但你应该可以使用
node = Node.objects.filter(node_type='comment')
node_titles = nodes.values_list('abs_parent__title', flat=True)
请参阅here
(注意:我假设因为这是“Djangotronic”做事的方式,它应该查询db最少次数,但我不确定。)