Как выполнить SQL LEFT JOIN с помощью Django?

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

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)
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
2
0
6 513
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Значит, в настоящее время нет другого способа справиться с чем-то вроде этого, за исключением перехода на необработанный SQL?

Ty. 16.01.2009 18:48

Я думаю, что это то, что вы хотите: docs.djangoproject.com/en/dev/topics/db/aggregation/…, не так ли?

Tiago 16.01.2009 18:51

Да, мне просто больно обновляться до разрабатываемой версии. Спасибо за вашу помощь.

Ty. 16.01.2009 20:22

Если вы действительно предпочитаете пока придерживаться 1.0, вы можете использовать этот метод, пока не переключитесь на 1.1: stackoverflow.com/questions/327807/…

Carl Meyer 17.01.2009 07:27

Без ветки агрегации вы могли бы сделать следующее, которое возвращает список из 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 (и, следовательно, не можете использовать новый агрегат), вы можете добиться этого с помощью подзапроса, переданного аргументу QuerySet extra (). В документации Django для extra () используется то, что вы пытаетесь достичь, в качестве примера (под заголовком select) здесь.

Другие вопросы по теме