检查对象是不是存在时出现奇怪的错误
Posted
技术标签:
【中文标题】检查对象是不是存在时出现奇怪的错误【英文标题】:Strange Error When Checking If Object Exists检查对象是否存在时出现奇怪的错误 【发布时间】:2021-12-28 17:56:36 【问题描述】:提前感谢您的帮助。 我正在尝试检查用户访问“myCart”页面时是否存在购物车对象。如果没有,它应该创建一个新实例并使用用户的 id 作为反向查找的外键。所以我在 if 语句中使用了 exists() 方法。奇怪的是,它没有执行 else 块,而是向我抛出一个错误,告诉我该对象不存在。测试用户还没有与之关联的购物车对象,这很明显。我不明白为什么它没有触发我的 else 语句。也许我已经编码太久了,需要一些睡眠,这就是我想念它的原因。无论如何,如果你们能看看我,我真的很感激。 :)
错误:Weird Error
#该应用的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)
【问题讨论】:
【参考方案1】:通过使用.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
model [Django-doc] 更好。更多信息可以查看referencing theUser
model section of the documentation。
注意:您可以使用
@login_required
decorator [Django-doc].
【讨论】:
嘿,非常感谢,我的家伙!那工作得很好。也变得更干净了!尊重! :D【参考方案2】:.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
【讨论】:
啊,这就是我所缺少的。我知道是这样的。非常感谢我的朋友!以上是关于检查对象是不是存在时出现奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010 在编译 C++/CLI 项目时出现奇怪的错误
在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误