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

Вернуться на верх