Как фильтровать по автору в Django? Получаю ошибку: В поле 'id' ожидается число

У меня есть приложение Django, которое функционирует как дневник, где главная страница представляет собой индексный список всех ранее созданных записей дневника. Сейчас я пытаюсь отфильтровать индекс так, чтобы пользователь видел только те записи дневника, которые он создал. Вот что я сделал:

Views.py

from django.shortcuts import render
from .models import DiaryEntry
from django.views import generic
from django.views.generic.edit import CreateView

def index(request):
    """View function for MyDiary."""

    author = DiaryEntry.author
    diary_entry = DiaryEntry.objects.filter(author=author).order_by('-created_on')

    context = {
         "diary_entry": diary_entry,
    }

    return render(request, 'diary_index.html', context=context)


class EntryDetailView(generic.DetailView):
    model = DiaryEntry
    def get_data(self, **kwargs):
        context = super(EntryDetailView, self).get_data(**kwargs)
        return context
 
class EntryCreate(CreateView):
    model = DiaryEntry
    fields = ['title', 'content']
    def form_valid(self, form):
       form.instance.author = self.request.user
       return super().form_valid(form)

Models.py

from django.db import models
from django.urls import reverse
from django.conf import settings

User = settings.AUTH_USER_MODEL

class DiaryEntry(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, 
                        on_delete = models.CASCADE
                        )
    def __str__(self):
        """String for representing the diary object."""
        return self.title
    def get_absolute_url(self):
        """Returns the url to access a detail record for this user entry."""
        return reverse('entry-detail', args=[str(self.id)])

HTML:

{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
    <h1>This is your diary!</h1>
    <hr>
    <h2>Here, you can write about anything you want to.</h2>
    <br>
    <div class="text-center">
    <a class="btn btn-primary" href="{% url 'entry-create' %}" role="button">Create a new diary entry</a>
    </div>
    <br>
    <br>
    {% for entry in diary_entry %}
    <h2><a href="{% url 'entry-detail' entry.pk %}">{{ entry.title }}</a></h2>
    <small>
        {{ entry.created_on.date }} |&nbsp;
    </small>
    <p>{{ entry.content | slice:":400" }}...</p>
    {% endfor %}

</div>
{% endblock %}

И URL-адреса:

from django.urls import path
from . import views

urlpatterns = [
path('', views.index, name='diary_index'),
 path('entry_detail/<int:pk>/', views.EntryDetailView.as_view(),  name='entry-detail'),
 path('entry/create/', views.EntryCreate.as_view(), name='entry-create'),
]

Когда я запускаю вышеописанное, я получаю следующую ошибку: Field 'id' expected a number but got <django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor object at 0x7f12feef3400>.

Может ли кто-нибудь помочь мне решить эту проблему? Я просмотрел другие ответы на подобные вопросы, но я все еще не могу понять, как правильно фильтровать записи по автору.

Заранее спасибо!

Проблема заключается в этой строке author = DiaryEntry.author. Если вы хотите фильтровать по автору, вам нужно иметь автора, по которому фильтровать, эта строка только выбирает свойство, она не дает вам автора. Рассмотрим этот пример:

author = Author.objects.get(id=1)
diary_entry = DiaryEntry.objects.filter(author=author).order_by('-created_on')

Это отфильтрует записи дневника по автору с идентификатором 1. Вы даже можете сделать это в одной строке, чтобы не запрашивать дважды:

diary_entry = DiaryEntry.objects.filter(author__id=1).order_by('-created_on')

Надеюсь, это имеет смысл. Итак, вопрос к вам: по какому автору вы хотите фильтровать, как получить этого автора?

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