2012-06-15 115 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)