检查对象是不是存在时出现奇怪的错误

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 the User 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 项目时出现奇怪的错误

使用valgrind时出现奇怪的错误?也许是一个错误?

在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误

在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误

读取磁盘时出现奇怪的错误

Access 2007,VBA:将 BLOB 插入链接表时出现奇怪的错误