django-taggit: есть ли способ производить меньше запросов к базе данных? - PullRequest
5 голосов
/ 01 июля 2011

Скажите, у меня есть модель:

class Entry(models.Model):
    ...
    tags = TaggableManager()

Когда я перебираю Entry.objects.all () в шаблоне, entry.tags.all создает еще один запрос к базе данных. Можно ли уменьшить количество запросов? Используя что-то вроде select_related () (я знаю, что это не будет работать, так как django-taggit использует многозначное отношение, но я уверен, что должен быть способ выбрать все записи со связанными тегами в 1 попадании)?

Ответы [ 2 ]

2 голосов
/ 03 октября 2013

Начиная с Django 1.4, вы можете использовать prefetch_related для извлечения отношений один-ко-многим в наборе запросов в одном запросе. К сожалению, это не работает блестяще с django-taggit, потому что свойство 'tags' является менеджером, а не истинным отношением, и поэтому prefetch_related не может это понять. Вместо этого вам нужно следовать отношению tagged_items:

entries = Entry.objects.prefetch_related('tagged_items__tag')

Затем вам нужно пройти через некоторые похожие искажения в коде шаблона, чтобы получить доступ к предварительно выбранным тегам, потому что entry.tags.all будет выполнять другой запрос, а не использовать предварительную выборку:

{% for tagged_item in entry.tagged_items %}
    <li>{{ tagged_item.tag.name }}</li>
{% endfor %}
0 голосов
/ 01 июля 2011

Попробуйте использовать Выберите Реверс . Он предназначен для захвата всего множества многих отношений с помощью одного запроса.

...