2011-06-10 119 views
9

我有模特這樣Django的反向查詢在模板

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 

我想列出頁面中所有博客。我已經寫了這樣

def listAllBlogs(request): 
    blogs= Blog.objects.all() 
    return object_list(
     request, 
     blogs, 
     template_object_name = "blog", 
     allow_empty = True, 
     ) 

而且我可以顯示博客的標語視圖,使得圖

{% extends "base.html" %} 
{% block title %}{% endblock %} 
{% block extrahead %} 

{% endblock %} 

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
    {% endfor %} 
{% endblock %} 

但是我想表明,這樣的事情blog__entry__name,但我不知道該怎麼我在模板中實現了這一點。 此外,博客中可能沒有條目。我如何檢測模板?

謝謝

+2

下面的兩個答案都是正確的,只是兩個備註。爲'blog'字段定義'related_name ='entries'',你就可以編寫'blog.entries'。並使用'select_related()',而不是進行N + 1個SQL查詢。 – DrTyrsa 2011-06-10 13:02:30

回答

18

要訪問博客條目(Related Manager):blog.entry_set.all

做其他動作,如果博客沒有條目,您必須在設置爲空時執行的{% empty %}標籤。

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
      {% for entry in blog.entry_set.all %} 
       {{entry.name}} 
      {% empty %} 
      <!-- no entries --> 
      {% endfor %} 
    {% endfor %} 
{% endblock %} 
+0

@brsbilgic [related_name](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name) – DrTyrsa 2011-06-10 13:20:22

+0

對於'OneToOneField',您可以簡單地使用:' blog.entry'(而不是'blog.entry_set')。 https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships – manji 2011-06-10 13:27:27

+0

這很好。謝謝!但是如果這種關係是一對一博客= models.OneToOneField(Blog,unique = True)。在{{blog.entry__headline}}模板中做類似事情的正確方法是什麼' – brsbilgic 2011-06-10 13:28:16

7

根據您的代碼,您可以執行以下操作。

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
      {% for entry in blog.entry_set.all %} 
       {{entry.name}} 
      {% endfor %} 
    {% endfor %} 
{% endblock %} 
+0

不應該是blog.entry_set而不是blog_entry_set? – bcoughlan 2011-06-10 12:57:00

+0

@waitinforatrain哎呀,是的,謝謝它應該是! – JamesO 2011-06-10 13:00:36