Как выполнить SQL LEFT JOIN с использованием Django? - PullRequest
2 голосов
/ 16 января 2009

По существу мне нужно количество каждой записи Комментарии:

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)

Ответы [ 3 ]

6 голосов
/ 16 января 2009

В django 1.1 есть поддержка агрегатных запросов, вы можете получить последнюю версию через ствол svn. Документ уже обновлен

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

2 голосов
/ 17 января 2009

Если вы не используете магистральный Django (и, следовательно, не можете использовать новый материал агрегации), вы можете добиться этого с помощью подвыбора, переданного в аргумент QuerySet extra (). Документация Django для extra () в качестве примера использует то, что вы пытаетесь достичь (под заголовком select) здесь .

1 голос
/ 17 января 2009

Без ветви агрегации вы можете сделать следующее, что возвращает список из 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...