Как правильно вывести поля в html-шаблон из модели User в Django ORM?

Задача: оптимизировать SQL запрос Django, вытащив только необходимые поля. Отправить их в шаблон.

У меня есть модель Post с внешним ключом на стандартную модель User:

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField("date published", auto_now_add=True)
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="posts"
    )

Вот нужный фрагмент в HTML-шаблоне, куда необходимо вставить имя автора:

{% for post in posts %}
<h3>
    Автор: {{ post.author.first_name }}, Дата публикации: {{ post.pub_date|date:'d M Y' }}
</h3>

view-функция:

from django.shortcuts import render

from .models import Post


def index(request):
latest = (
    Post
    .objects
    .order_by('-pub_date')[:10]
    .select_related('author')
    .values('pub_date', 'author__first_name')
)
return render(request, 'index.html', {'posts': latest})

Вот как выглядит фрагмент страницы на локальном сервере: введите сюда описание изображения

И вот такой итоговый sql-запрос показывает django debug toolbar:

введите сюда описание изображения

В таблице user у меня есть один пользователь и все посты относятся к нему. Если не использовать .values во view, то все атрибуты автора, которые запрашиваю в шаблоне прекрасно выводятся (например, last_name, username, get_full_name()), но тогда sql запрашивает все поля таблицы user (как он обычно и делает), а я хочу получить только определенные для экономии памяти. Пробовал так же пересоздавать проект, использовать User = get_user_model(). Ничего не помогло.

Мне помогли с этим вопросом на другом ресурсе. Есть в документации Django две функции, которые помогают исключить определенные слова из запросов (only и defer). Вот: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.only

Вернуться на верх