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