Django: Как получить доступ к полям модели через отношения OneToOne в views.py?
в models.py у меня есть модели буксировки:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to='static/images/account/avatar', default='/static/images/default-avatar.png')
bio = models.CharField(max_length=300, blank=True, null=True)
class Author(models.Model):
user = OneToOneField(Profile, on_delete=models.CASCADE)
в файле views.py нужно получить доступ к имени пользователя (оно находится в модели User) код в views.py:
def author(request, username):
authors = ...
context = {
'authors': authors
}
return render(request, 'account/profile.html', context)
что нужно поставить вместо трех точек перед authors=
?
например, authors = Author.user.user.get(username=username)
, но это не работает.
Вы можете получить объект Author
, у которого есть связанный Profile
, у которого есть связанный User
с данным именем пользователя с помощью:
from django.shortcuts import get_object_or_404
def author(request, username):
author = get_object_or_404(Author, user__user__username=username)
context = {
'author': author
}
return render(request, 'account/profile.html', context)
Поскольку username
уникальны, а вы используете OneToOneField
, существует максимум один такой Author
. Таким образом, мы получаем это как author
, и в данном контексте лучше работать с author
, а не с .authors
Кроме того, вы можете переименовать OneToOneField
из модели Author
: поскольку она относится к Profile
, а не к User
, более уместно profile
:
class Author(models.Model):
profile = OneToOneField(Profile, on_delete=models.CASCADE)
Если поле переименовано, представление должно быть изменено на:
from django.shortcuts import get_object_or_404
def author(request, username):
author = get_object_or_404(Author, profile__user__username=username)
context = {
'author': author
}
return render(request, 'account/profile.html', context)