queryset без дополнительных запросов в бд? допустим, есть код
posts = Post.publications.all()
tags = Tag.objects.all()
for tag in tags:
print(posts.filter(tags=tag))
как сделать так, чтоб при каждой итерации цикла не было нового запроса в базу? хочу просто получить сразу все данные, а потом уже работать с ними. prefetch_related('tags') только увеличило количество запросов
А он в цикле колотит по БД разве? Вы проверили это? Он один раз ударит и все. С остальными данными он будет работать из кэша. Но это надо проверить. Так что если хочется вот именно в цикле, я подозреваю, что тоже норм.
Там каждый раз новый qs в print создается и обрабатывается
Попробуй сделать tags = Tag.objects.all().prefetch_related('posts'), и потом по тегам проходиться и получать список постов. Правда там возможно дубликаты будут
я бы так сделал, но для тегов используется django-taggit, в котором, судя по всему, нельзя получить все посты, связанные с тегом
А, точно. Думал, это обычная модель
Попробуй вытащить все теги с оптимизацией через related, а позже в цикле вызывай print(tag.posts) / all()
prefetch_related('tags') только увеличивает количество запросов, а получить посты через модель Tag нет возможности, потому что использую django-taggit
https://django-taggit.readthedocs.io/en/latest/custom_tagging.html#custom-foreignkeys
Обсуждают сегодня