RelatedObjectDoesNotExist?
может кто-нибудь помочь мне понять, в чем проблема Я создаю модель на сайте электронного коммерсанта
модели:
class Customer (models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(null=True, max_length=200)
email = models.CharField(null=True, max_length=200)
def __str__(self):
return self.name
затем в views я добавляю его в корзину:
def cart(request):
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(
customer=customer, complete=False)
items = order.orderitem_set.all()
else:
items = []
context = {'items': items}
return render(request, 'ecomeres/cart.html', context)
А OneToOneField фактически является полем ForeignKey с ограничением unique=True
и поле OneToOneField не означает, что ссылающаяся модель всегда имеет customer объект (в вашем случае). Вот почему в некоторых случаях, если user.customer для некоторого пользователя не существует, то возникает ошибка RelatedObjectDoesNotExist.
Так что вы должны либо использовать try-except и поднимать exception, если объект не существует.
В views.py
from django.core.exceptions import ObjectDoesNotExist
def cart(request):
try:
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(
customer=customer, complete=False)
items = order.orderitem_set.all()
else:
items = []
context = {'items': items}
return render(request, 'ecomeres/cart.html', context)
except ObjectDoesNotExist:
# hanlde your case when model object does not exist.
else:
# this block is excuted only if try except don't raise exception
Или вы также можете использовать метод Python hasattr().
def cart(request):
if request.user.is_authenticated:
if hasattr(request.user, 'customer')
customer = request.user.customer
order, created = Order.objects.get_or_create(
customer=customer, complete=False)
items = order.orderitem_set.all()
else:
# handle if request.user has no customer
else:
items = []
context = {'items': items}
return render(request, 'ecomeres/cart.html', context)
Подробнее о OneToOneField можно прочитать в официальной документации, где вы узнаете о ObjectDoesNotExist и hasattr