为什么同一个对象在一个实例中抛出“NoneType”对象属性错误而不是其他实例?

时间:2013-04-08 22:58:16

标签: python mysql django attributeerror nonetype

我正在使用django在我的电子商务网站上设置购物车功能。所有项目都在MySQL表格中输入为cart_item

在提问之前,相关代码:

charm = False
if postdata.get('charm_sku'):
    charm_sku = postdata.get('charm_sku','')
    ch = get_object_or_404(Charm, sku=charm_sku)


#get products in cart
cart_products = get_cart_items(request)
product_in_cart = False
# check to see if item is already in cart
for cart_item in cart_products:
    if cart_item.product.id == p.id:
         if charm == True:
              if cart_item.charm.id == ch.id:
                 # update the quantity if found
                 cart_item.augment_quantity(quantity)
                 product_in_cart = True
         else:
             if cart_item.charm.id == "":
                # update the quantity if found
                cart_item.augment_quantity(quantity)
                product_in_cart = True

编辑: 我重新编写了如上所示的代码,导致两个if cart_item.charm.id抛出attirbuteerror:'NoneType' object has no attribute 'id'。在某种程度上,我认为这改善了情况,因为我怀疑第一个似乎“成功”的事实上是第一个if charm == True失败,因此从未测试过第一个if cart_item.charm.id == ch.id。问题仍然存在:当For循环明确声明cart_item时,为什么这会引发AttributeError,而cart_items显然同时将魅力列和id分配给所述列?

编辑2: 我可以不从嵌套的if引用cart_item吗?这是我能想到的唯一一件事,但同时我觉得我应该能够,所以也许这是错的?

2 个答案:

答案 0 :(得分:1)

NoneType意味着您实际上获得了None而不是类的实例。这可能意味着分配失败或者函数调用返回了意外结果。在cart_item的情况下,您对charm == False的分配可能会失败。检查设置这两个变量的任何代码(赋值或函数调用)。

答案 1 :(得分:0)

不知何故,您的charm == False条件也暗示cart_item.charm is None。由于在访问None属性之前未检查id,因此会引发异常。

我对这些变量和对象类型知之甚少,无法理解为什么,但if有条件地掩盖了你的问题。