Странная ошибка при проверке существования объекта
Заранее спасибо за помощь. Я пытаюсь проверить, существует ли объект корзины, когда пользователь посещает страницу "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