Как правильно вывести поля в 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