Ошибка RelatedObjectDoesNotExist, несмотря на использование оператора if - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть код ниже if self.request.user.is_authenticated() and self.request.user. userlocation Что я не понимаю, почему я получаю этого пользователя нет ошибки размещения пользователя. У меня есть утверждение if, если условие не выполняется, если оно не просто отключится и покажет контекст

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)
        context['event_list'] = Event.objects.all()
        if self.request.user.is_authenticated() and self.request.user.userlocation:
            print("The code reached here ")
        return context

ниже - models.py

class UserLocation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    lat = models.FloatField(blank=True, null=True)
    lon = models.FloatField(blank=True, null=True)
    point = models.PointField(srid=4326, default='SRID=4326;POINT(0.0 0.0)')
    objects = models.GeoManager()

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Полагаю, вы создали модель, похожую на:

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

Вопреки распространенному мнению, поле «один-к-одному» означает , а не означает, что ссылочная модель (здесь User) всегда имеет объект UserLocation. OneToOneField на самом деле представляет собой поле ForeignKey с ограничением unique=True (и некоторой дополнительной логикой, такой, что обратное отношение не userlocation_set, а userlocation). Таким образом, это означает, что две UserLocation могут никогда не ссылаться на один и тот же User объект.

Таким образом, возможно, что для некоторых user не существует user.userlocation, и в случае вызова атрибута, к сожалению, он возвращает не None, но выдает ошибку (произошла ошибка). Билеты на запрос, что он возвращает None, но, вероятно, он не будет реализован в (ближайшем) будущем из-за обратной совместимости).

Таким образом, вы должны проверить с try - catch - except:

from django.core.exceptions import ObjectDoesNotExist

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)
        context['event_list'] = Event.objects.all()
        if self.request.user.is_authenticated()
            try:
                my_location = self.request.user.userlocation
            except ObjectDoesNotExist:
                # ... hande case where the location does <b>not</b> exists
            else:
                print("The location is {}".format(my_location))
        return context
0 голосов
/ 01 сентября 2018

Используйте дополнительное условие для вашего условия if, которое проверяет наличие атрибута userlocation с помощью Python hasattr() метод

Попробуйте это

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)
        context['event_list'] = Event.objects.all()
        if self.request.user.is_authenticated() and \
                <b>hasattr(self.request.user, 'userlocation')</b> and \
                self.request.user.userlocation:
            print("The code reached here ")
        return context



Ссылка
Django проверяет, существует ли связанный объект, ошибка: RelatedObjectDoesNotExist

0 голосов
/ 01 сентября 2018

класс User не имеет переменной userlocation. использовать пользовательский класс пользователя, унаследованный от User

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