По сути, мне нужно количество комментариев к каждой записи:
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)

В django 1.1 есть поддержка агрегированных запросов, вы можете получить последнюю версию через svn trunk. Документ уже обновлен
http://docs.djangoproject.com/en/dev/topics/db/aggregation/
Я думаю, что это то, что вы хотите: docs.djangoproject.com/en/dev/topics/db/aggregation/…, не так ли?
Да, мне просто больно обновляться до разрабатываемой версии. Спасибо за вашу помощь.
Если вы действительно предпочитаете пока придерживаться 1.0, вы можете использовать этот метод, пока не переключитесь на 1.1: stackoverflow.com/questions/327807/…
Без ветки агрегации вы могли бы сделать следующее, которое возвращает список из 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) здесь.
Значит, в настоящее время нет другого способа справиться с чем-то вроде этого, за исключением перехода на необработанный SQL?