如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章