2012-06-15 110 views
0

在下面的例子中,我有一个模型Proof,其中包含模型Option的外键。 我想列出我的模板中的所有选项以及它们各自的证明。我将如何去做有关django的连接?我尝试使用_set.all()方法,但似乎不适用于查询集,只能在单个列表中使用。在django查询集中访问外键

感谢您的帮助:)

Models.py

class Option(TimeStampActivate): 
    title = models.CharField(max_length=500,null=True) 
    user = models.ForeignKey(User) 
    option = models.CharField(max_length=300) 

class Proof(TimeStampActivate): 
    user = models.ForeignKey(User) 
    option = models.ForeignKey(Option) 
    comment = models.CharField(max_length=500,null=True) 
    link = models.URLField() 

View.py

options = Option.objects.all() 

回答

4

我认为这应该在模板中使用options = Option.objects.all() in view()。

{% for option in options %} 
    {{option}} 
    {% for proof in option.proof_set.all %} 
     {{proof}} 
    {% endfor %} 
{% endfor %} 
+0

感谢这工作! 但以这种方式查找,有没有为循环中的每个项目运行一个新的SQL查找?或者刚刚完成一次连接? – CodeMonkeyB

+0

我不确定,但我认为不会有每个项目的新查找(这是在模板上下文中使用从视图中的查询获得的结果完成的,因此它不会触及数据库)。即使在一个视图中,'Option.objects.all()'一开始并不会触及数据库。查看[queryset API参考](https://docs.djangoproject.com/en/dev/ref/models/querysets/)了解更多信息。 – machaku

+0

[select_related](https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related)和[prefetch_related](https://docs.djangoproject.com/en/dev/ref/models/querysets /#prefetch-related)可以提高检索相关对象的性能。注意:在Django-1.4中预取相关的工作 – machaku

0

有可能是查询和得到你想要什么奇特的方式,但如何关于创建由选项键入的校样字典?

from collections import defaultdict 
proofs = Proof.objects.all() 
options = defaultdict(list) 
for p in proofs: 
    options[p.option].append(p)