Django: обращение к related_name в модели возвращает None
models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
pass
class Likes(models.Model):
pass
class Unlikes(models.Model):
pass
class Post(models.Model):
post_text = models.TextField(max_length=1000)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
likes = models.ManyToManyField(User, null=True, related_name="liked_posts")
unlikes = models.ManyToManyField(User, null=True, related_name="unliked_posts")
def __str__(self):
return f'{self.user} at {self.created_at}: {self.post_text[0:20]}...'
views.py
def profile(request, username):
print(User.objects.get(username=username).posts)
print(Post.objects.filter(user = User.objects.get(username=username)))
return render(request, 'network/profile.html', {
'user': request.user,
'profile': User.objects.get(username=username)
})
Мой файл models.py
определяет отношения между User
и post
следующим образом:
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
Выполняется:
print(User.objects.get(username=username).posts)
print(Post.objects.filter(user = User.objects.get(username=username)))
возвращает:
network.Post.None
<QuerySet [<Post: Joe at 2022-12-18 10:48:18.941880+00:00: test1...>, <Post: Joe at 2022-12-18 10:53:27.407349+00:00: test1...>, <Post: Joe at 2022-12-18 10:53:34.167508+00:00: test2...>]>
Мой вопрос: Как может первый оператор печати вернуть ни одной строки, когда второй оператор возвращает ожидаемое значение (3 строки)? Насколько я понимаю, эти два оператора должны достигать одного и того же?
.posts
является Manager
, а не QuerySet
, вы можете использовать .all()
[Django-doc], чтобы превратить его в QuerySet
:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request, username):
print(User.objects.get(username=username).posts.all())
print(Post.objects.filter(user=User.objects.get(username=username)))
return render(
request,
'network/profile.html',
{'user': request.user, 'profile': User.objects.get(username=username)},
)
Note: You can limit views to a view to authenticated users with the
@login_required
decorator [Django-doc].