Начало Django: выполнение подвыборов и других сложных запросов - PullRequest
0 голосов
/ 19 сентября 2009

Я хочу выполнить полусложный запрос в 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? Есть ли рекомендуемый способ / лучшие практики для выполнения таких запросов?

UPDATE:

Я получил его с небольшими изменениями благодаря приведенному ниже коду 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 ]

6 голосов
/ 19 сентября 2009

Вы можете сделать это с помощью агрегации, описанной здесь .

Что-то вроде:

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
0 голосов
/ 19 сентября 2009

Не пытайтесь производить SQL-запросы буквально в Django. Вы хотите посчитать все комментарии к записям в блоге. Как простой цикл, это просто.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...