Как получить модель-объект, используя другие модели в django
Мне нужно если пользователь запрашивает следующую страницу, то ответом на запрос должна быть страница, содержащая конкретные сообщения, сделанные пользователями, за которыми следует пользователь, который запрашивает. Я думал сделать некоторые действия для этого:
- Get the requester
- Get the users who are followed by the requester
- Get the posts created by the users the who are being followed
В моем models.py:
class User(AbstractUser):
image_url = models.CharField(max_length=5000, null=True)
class Follow(models.Model):
follower = models.ForeignKey(
User, on_delete=models.PROTECT, related_name="follower")
following = models.ForeignKey(
User, on_delete=models.PROTECT, related_name='following')
class Post(models.Model):
content = models.CharField(max_length=140)
date_created = models.DateTimeField(auto_now_add=True)
poster = models.ForeignKey(User, on_delete=models.CASCADE)
В моем файле views.py:
def following_page(request, username):
user = User.objects.get(username=username)
f = user.following.all()
posts = Post.objects.filter(poster=f.following)
posts = posts.order_by("-date_created").all()
return render(request, 'network/index.html', {
"posts": posts
})
В нем говорится
AttributeError 'QuerySet' object has no attribute 'following'
Нужно ли менять модель? Как решить проблему?
Вы можете фильтровать с помощью:
from django.contrib.auth.decorators import login_required
@login_required
def following_page(request):
posts = Post.objects.filter(poster__following__follower=request.user)
return render(request, 'network/index.html', {
'posts': posts
})
Поскольку вы используете вошедшего пользователя, используется request.user
, и, таким образом, представлению нет смысла принимать имя пользователя.
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_required
декоратора [Django-doc].
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL
[Django-doc] для ссылки на модель пользователя, чем использоватьUser
модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUser
модель раздел документации .