我想在Django中执行半复杂查询。例如,我想要这样的东西:
SELECT
b.*,
(SELECT count(id) FROM comments c WHERE c.blog_id = b.id) AS number_of_comments
FROM blog b
WHERE 1
在我的PHP背景下,Code Igniter和Zend Framework有“查询构建器”。您可以使用框架中的方法构建SQL查询。这有点像Django吗?
在Django中构建和执行复杂查询的最佳方法是什么?有没有推荐的方法/最佳做法来进行这些类型的查询?
更新
由于mherren的代码如下,我的工作变化很小。这是代码的更新版本。
在我的views.py中,我有这个:
def index(request):
blog_posts = Blog.objects.all().annotate(Count('comment')).order_by('-pub_date')[:5]
return render_to_response('blog/index.html',
{'blog_posts': blog_posts})
在我的模板文件(index.html)中,我有这个:
Welcome...
{% if blog_posts %}
<ul>
{% for post in blog_posts %}
<li>
<b>
<a href="/blog/post/{{ post.id }}">{{ post.title }}</a>
</b> ({{ post.pub_date }})<br/>
{{ post.content }}<br/>
{{ post.comment__count }} comment(s)<br/>
by: {{ post.author }}<br/><br/>
</li>
{% endfor %}
</ul>
{% else %}
<p>No posts are available.</p>
{% endif %}
希望这也有助于其他人。谢谢你的一切!
答案 0 :(得分:6)
您可以使用here所述的聚合来完成此操作。
喜欢的东西:
class Post(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
#additional fields here...
class Comment(models.Model):
post = models.ForeignKeyField(Post)
#additional fields here...
...
from django.db.models import Count
from project.application.models import Post, Comment
post_list = Post.objects.annotate(Count('comment_set'))
for p in post_list:
print p.comment_set__count
答案 1 :(得分:0)
不要尝试在Django中逐字地生成SQL查询。您想要计算博客条目的所有评论。作为一个简单的循环,这很简单。
for b in Blog.objects.all():
c = b.comment_set.count()
这是您在Django中使用的代码,而不是复杂的SQL查询。
这将获取所有博客对象及其关联计数,允许您显示博客对象中的任何相关字段。
请完整阅读http://docs.djangoproject.com/en/dev/topics/db/queries/#topics-db-queries以了解在Django中查询数据的方法。