Соответствующий запрос не существует (Django)

Я создал сайт форума. При нажатии на профиль пользователя получаю в консоли ошибку library.models.SiteUser.DoesNotExist: SiteUser, соответствующий запросу, не существует.

В браузере также отображается: DoesNotExist at /profile/1/

СайтПользователь, соответствующий запросу, не существует.

Браузер выделяет эту строку userprof = SiteUser.objects.get(id=pk)

Это мой views.py:

def userProfile(request, pk):
    user = User.objects.get(id=pk)
    **userprof = SiteUser.objects.get(id=pk)**
    posts = user.post_set.all()
    post_comments = user.comment_set.all()
    interests = Interest.objects.all()
    context = {
        'user': user,
        'userprof': userprof,
        'posts': posts,
        'post_comments': post_comments,
        'interests': interests
    }
    return render(request, 'library/profile.html', context)

models.py:

class SiteUser(models.Model):
    page_user = models.OneToOneField(User, on_delete=models.CASCADE)
    about = HTMLField()
    profile_pic = models.ImageField('profile_pic', upload_to='covers', null=True)

Любая помощь будет очень признательна.

Первичные ключи

User и SiteUser не будут одинаковыми. Вы можете легко получить SiteUser из следующего запроса:

userprof = user.siteuser  # efficient solution

Or

userprof = SiteUser.objects.get(user_id=pk)  # alternative solution but should not be used in this code sample

По причине их отношения OneToOne. Для получения дополнительной информации, пожалуйста, ознакомьтесь с документацией.

Если у вас есть отношения, то всегда используйте их, если это возможно. Вместо того чтобы получать SiteUser, имея User pk (не обязательно всегда одно и то же), получайте его, используя отношение между ними:

# bad and risky
user = User.objects.get(id=pk)
userprof = SiteUser.objects.get(id=pk)

# good and always working if object exists
user = User.objects.get(id=pk)
userprof = user.siteuser

Хорошая практика - называть related_name аргумент для такого использования:

class SiteUser(models.Model):
    page_user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='foobar')

Тогда вы можете назвать его так:

user = User.objects.get(id=pk)
userprof = user.foobar
Вернуться на верх