Данные в шаблонах

Мне нужна ваша поддержка. У меня есть 2 модели Author и Post, я хочу отобразить данные для конкретного автора в шаблоне. Я хочу отобразить посты конкретного автора, и информацию (имя_и фамилия) этого автора. В моем файле представления я создал метод с 2 наборами запросов. Один из этих наборов запросов ищет в таблице Post посты определенного автора, а другой набор запросов ищет в таблице Author информацию об авторе-владельце постов.

Мой вопрос, могу ли я сделать это с помощью только одного QuerySet? Если да, то как я могу отобразить это в шаблоне?

МОДЕЛИ

class Autor(models.Model):
    first_name = models.CharField(max_length=30, null=False, verbose_name='First Name')
    last_name = models.CharField(max_length=30, null=False, verbose_name='Last Name')

class Post(models.Model):
    autor = models.ForeignKey(Autor, on_delete=models.CASCADE)
    post = models.CharField(max_length=200, null=False, verbose_name='Post')

VIEW.PY

def index(request):
    autor = Autor.objects.filter(first_name='Peter').first()
    autor_posts = Post.objects.filter(autor__first_name='Peter')
    return render(request, 'posts.html', {'autor_posts': autor_posts, 'autor': autor})

POSTS.HTML

Author: {{ autor.first_name }}, {{ autor.last_name }}


Posts:
{% for post in autor_posts %}
    <p>{{ post.id }}, {{ post.post }}</p>
    <p></p>
{% endfor %}

Вы можете сделать это с помощью:

def index(request):
    autor = Autor.objects.prefetch_related('post_set').filter(first_name='Peter').first()
    return render(request, 'posts.html', {'autor': autor})

В этом случае все равно будет выполняться два запроса: один для получения autor и один для предварительной выборки всех связанных post постов autor. Но преимущество в том, что вам не нужно вручную писать отдельный фильтр для получения постов autor.

Итак, в своем шаблоне вы можете сделать следующее:

Author: {{ autor.first_name }}, {{ autor.last_name }}

Posts:
{% for post in autor.post_set.all %}
    <p>{{ post.id }}, {{ post.post }}</p>
    <p></p>
{% endfor %}
Вернуться на верх