如何使用 Django 执行 SQL LEFT JOIN?

Posted

技术标签:

【中文标题】如何使用 Django 执行 SQL LEFT JOIN?【英文标题】:How to perform SQL LEFT JOIN's using Django? 【发布时间】:2010-10-01 19:58:46 【问题描述】:

基本上我需要计算每个条目评论:

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)

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

所以目前除了放入原始 SQL 之外,没有其他方法可以处理此类事情? 我认为这就是你想要的:docs.djangoproject.com/en/dev/topics/db/aggregation/… 不是吗? 是的,我不得不升级到开发版本只是一种痛苦。感谢您的帮助。 如果你现在真的更喜欢坚持使用 1.0,你可以使用这个方法直到你切换到 1.1:***.com/questions/327807/…【参考方案2】:

如果您不使用主干 Django(因此不能使用新的聚合内容),您可以通过传递给 extra() QuerySet 参数的子选择来实现这一点。 extra() 的 Django 文档使用您想要实现的作为示例(在选择标题下)here。

【讨论】:

【参考方案3】:

如果没有聚合分支,您可以执行以下返回 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 %

【讨论】:

以上是关于如何使用 Django 执行 SQL LEFT JOIN?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python/Django 执行 HTML 解码/编码?

如何查看Django ORM执行的SQL语句

如何在 django 迁移中执行原始 SQL

为啥 LEFT(Datetime,1) 给我“J”?

Django(22)Django执行SQL语句

调整 SQL 表中的行