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)
Вернуться на верх