У меня есть такие модели:
class Comment(models.Model):
text = models.TextField(max_length = 250, blank = False)
author = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Product(models.Model):
name = models.CharField(max_length = 40)
comments = generic.GenericRelation(Comment)
В этом шаблоне я показываю последние 5 комментариев всех продуктов:
<ul>
{% for comment in last_comments %}
<li><a href="/user/{{ comment.author }}/">{{ comment.author }}</a> on <a href="/product/{{ comment.content_object.name }}/">{{ comment.content_object }}</a>
<br>{{ comment.text }}</li>
{% endfor %}
</ul>
Если я получу last_comments
с last_comments = Comment.objects.all().order_by('-id')[:5]
, панель инструментов отладки django сообщает, что было выполнено 25 запросов.
Если я получу last_comments
с last_comments = Comment.objects.select_related().all().order_by('-id')[:5]
, панель инструментов отладки django сообщает, что было выполнено 20 запросов.
Но почему select_related
также не выбирает связанный объект content_object? В панели инструментов отладки django я вижу 5 запросов на получение продукта. И, безусловно, являются следствием {{ comment.content_object }}
Вероятно, причина в том, что я использую GenericForeignKey в Comment
модели.
У вас есть идеи по этому поводу?