如何使用Django执行SQL LEFT JOIN?

时间:2009-01-16 15:25:21

标签: database django performance postgresql

基本上我需要对每个条目评论进行计数:

SELECT e.*, COUNT(c.id) as comments FROM blog_entry e LEFT JOIN blog_comment c ON e.id = c.entry_id GROUP BY e.id, e.name, e.name_slug, e.date_published, e.category, e.image, e.body, e.is_published, e.views, e.subscription_sent ORDER BY e.date_published DESC LIMIT 15;

但我不知道如何使用Django来解决这个问题。

这是我到目前为止所做的,它完美无缺,除了没有评论数。有人能指出我使用Django进行这样的连接的正确方向吗?

from project.blog.models import Entry, Comment

def index(request):
    latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:15]
    return render_to_response('blog/index.html', {'latest_entry_list': latest_entry_list)

3 个答案:

答案 0 :(得分:6)

django 1.1支持聚合查询,你可以通过svn trunk获取最后一个版本。 该文档已更新

http://docs.djangoproject.com/en/dev/topics/db/aggregation/

答案 1 :(得分:2)

如果你没有使用trunk Django(因此不能使用新的聚合内容),你可以通过传递给extra()QuerySet参数的子选择来实现。 extra()的Django文档使用您尝试实现的示例(在选择标题下)here

答案 2 :(得分:1)

如果没有聚合分支,您可以执行以下操作,返回2个元组的列表:

  from project.blog.models import Entry, Comment

  def index(request):
    latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:15]
    latest_entry_list_comment_count = [(x, x.count()) for x in latest_entry_list]
    return render_to_response('blog/index.html', {
         'latest_entry_list': latest_entry_list,
)

只需在模板中使用它:

{% for entry in latest_entry_list %}
    Entry: {{entry.0}}
    Comment count: {{entry.1}}
{% endif %}