开始Django:执行子选择和其他复杂查询

时间:2009-09-19 03:07:54

标签: django

我想在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 %}

希望这也有助于其他人。谢谢你的一切!

2 个答案:

答案 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中查询数据的方法。