2012-06-15 3 views
0

В приведенном ниже примере у меня есть модель Proof, которая содержит внешний ключ к модели Option. Я хочу перечислить все варианты в моем шаблоне вместе со своими соответствующими доказательствами. Как я могу сделать соответствующие объединения в django? Я попытался использовать метод _set.all(), но, похоже, он не работает в наборе запросов, только в одном листинге.Доступ к внешнему ключу в django queryset

Спасибо за вашу помощь :)

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() ввиду().

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

Спасибо, что сработало! Но если вы посмотрите, как это сделать, есть ли новый цикл поиска sql для каждого элемента цикла? Или это просто одно соединение? – CodeMonkeyB

+0

Я не уверен, но я думаю, что не будет нового поиска для каждого элемента (это делается в контексте шаблона, используя результаты, полученные из вашего запроса в представлении, поэтому он не попадет в базу данных). Даже в представлении 'Option.objects.all()' сначала не попадает в базу данных. Для получения дополнительной информации просмотрите ссылку на запрос 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) 
Смежные вопросы