2011-06-10 166 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