Django запись пользователя не найдена - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь расширить пользовательскую модель в django, используя модель клиента (это может быть не идеальный путь, но эта лодка уже прошла). Когда я пытаюсь получить доступ к записи пользователя в шаблоне, я получаю сообщение об ошибке:

No Client matches the given query

models.py

class Client(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

views.py

def update_client_details(request):
    if request.user.is_authenticated:
        user = request.user
        # print('pk', user.pk)
        client = get_object_or_404(Client, pk=user.pk)

Если я печатаю user.pk, я вижу то, что ожидаю.

Почему он не возвращает объект?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Поскольку вы используете user.pk в get_object_or_404(Client, pk=user.pk), поскольку он попытается найти pk в Client модели, но в клиентской модели нет данных, доступных в соответствии с данным первичным ключом в get_object_or_404(Client, pk=user.pk), потому что это pk - это пользователь pk.

Итак, если вы хотите получить объект согласно user, вы должны написать, как показано ниже ...

client = get_object_or_404(Client, user=user)

Или вы можете использовать как простой способ ...

client_obj = Client.objects.get(user=request.user)
0 голосов
/ 04 марта 2020

Используя этот ответ Я понял, что мне нужно добавить:

profile, created = Profile.objects.get_or_create(user=request.user)

к views.py

Итак просмотров .py теперь выглядит так:

def update_client_details(request):
    if request.user.is_authenticated:
        user = request.user
        profile, created = Profile.objects.get_or_create(user=request.user)

и у меня есть доступ к данным пользователя и профиля

Профиль для пользователя создается, если его не существует

0 голосов
/ 27 февраля 2020

Потому что вы запросили модель клиента с идентификатором модели пользователя. Вы можете использовать этот запрос

client = get_object_or_404(Client, pk=user.pk)

вместо

client = get_object_or_404(Client, user=user)

Если вы хотите проверить, существует ли какой-либо клиент, связанный с request.user, вы можете использовать следующие запросы:

client = Client.objects.filter(user=request.user).first() 
# this query returns None if there is no client related with your user.
if client:
    #your update processes
else:
    # your client not exist commands

Вы также можете использовать hasattr метод. Здесь есть образец здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...