Странная ошибка при проверке существования объекта

Заранее спасибо за помощь. Я пытаюсь проверить, существует ли объект корзины, когда пользователь посещает страницу "myCart". Если нет, то он должен создать новый экземпляр и использовать id пользователя в качестве внешнего ключа для обратного поиска. Поэтому я использовал метод exists() в операторе if. Странно то, что вместо выполнения блока else он просто выдает ошибку, сообщая мне, что объект не существует. У тестового пользователя еще нет связанного с ним объекта корзины, и это очевидно. Я не понимаю, почему не срабатывает оператор else. Возможно, я слишком долго кодировал и мне нужно немного поспать, поэтому я и не понимаю. В любом случае, если бы вы могли взглянуть на это, я был бы вам очень признателен :)

Ошибка: Странная ошибка

# файл views.py для этого приложения:

def myCart(request):
    context = {}
    if request.user.is_authenticated:
        owner = request.user.id
        if Cart.objects.get(cart_owner=owner).exists():
            context['cart'] = cart
            return render(request, 'cart/myCart.html', context)
        else:
            cart = Cart(cart_owner=owner)
            context['cart'] = cart
        return render(request, 'cart/myCart.html', context)
    else:
        return HttpResponseRedirect(reverse("login"))



def update_cart(request):
    
    if request.user.is_authenticated:
        owner = request.user.id
        cart = Cart.objects.get(cart_owner=owner)


        productID = request.GET['id']
        product = Product.objects.get(pk=productID) 

        if not product in cart.products.all():
            cart.products.add(product)
        else:
            cart.products.remove(product)

        new_total = 0.00
        for item in cart.products.all():
            new_total += float(item.priceNotax)

        cart.total = new_total
        cart.save()
        return HttpResponseRedirect(reverse("myCart"))

    else:
        return HttpResponseRedirect(reverse("login"))

Модель тележки:

class Cart(models.Model):
    cart_owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    products = models.ManyToManyField(Product, null=True, blank=True)
    total = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
    timestamp = models.DateTimeField(auto_now_add=False, auto_now=True)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    active = models.BooleanField(default=True)

    def __unicode__(self):
        return "Cart id: %s" %(self.id)

Используя .get(…), вы получаете Cart, и если это сделано успешно, .exists() не будет работать, поскольку у объекта модели нет .exists() объекта.

Вы можете работать с .get_or_create(…) [Django-doc] для получения или создания Cart объекта в случае, если такого Cart не существует:

from django.contrib.auth.decorators import login_required

@login_required
def myCart(request):
    context = {}
    context['cart'], __ = Cart.objects.get_or_create(cart_owner=request.user)
    return render(request, 'cart/myCart.html', context)

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .


Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора @login_required декоратора [Django-doc].

.get() выдаст ошибку, если не найден ровно 1 объект. Вместо этого замените его на .filter(), и тогда вы сможете проверить .exists()
. Следовательно, замените Cart.objects.get(cart_owner=owner).exists() на Cart.objects.filter(cart_owner=owner).exists()
. В качестве альтернативы можно использовать блок try-except, который технически немного быстрее:

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None
Вернуться на верх