Как select_related по обратному внешнему ключу?

Возможный дубликат:
левый внешний обратный select_related в Django?

У BlogPost много Comment. Я хочу получить список BlogPost и все их комментарии.

Таким образом, у меня есть

BlogPost.objects.filter(my_filter).select_related()

Но ForeignKey находится на Comment, а не на BlogPost, поэтому select_related() не выполняет предварительную выборку комментариев. Есть ли способ заставить это работать?

Я не могу отменить запрос (Comment.objects...), потому что тогда другие объекты, которые select_related() извлекает, не будут работать. Мне нужно, чтобы это работало в обе стороны.


person mpen    schedule 31.07.2011    source источник


Ответы (1)


Почему вы не получаете комментарии, а затем используете перегруппировку для их отображения:

# Select all Comments with BlogPost data - one query
comments = Comment.objects.select_related('blog_post').order_by('-blog_post').all()

Затем в шаблоне:

{% regroup comments by blog_post as posts %}
{% for blog_post in posts %}

    <p>Blog post {{ blog_post.title }}</p>
    <ul>
    {% for comment in blog_post.comments %}
    ...
    {% endfor %}
    </ul>
    </p>
{% endfor %}
person Mariusz Jamro    schedule 30.01.2012
comment
Я думаю, из-за моего последнего абзаца. BlogPost имеет другие внешние ключи, с которыми select_related работает, и я хочу, чтобы он продолжал работать с ними. Извлекая сначала комментарии, вы просто смещаете проблему. - person mpen; 31.01.2012
comment
Другая проблема с этим решением заключается в том, что оно не будет получать сообщения в блогах без комментариев. - person bgcode; 17.02.2012