【问题标题】:Why is the same object throwing a "NoneType" object Attribute error in one instance and not others?为什么同一个对象在一个实例中抛出“NoneType”对象属性错误而不在其他实例中抛出?
【发布时间】:2013-03-31 04:59:03
【问题描述】:

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

提问前,相关代码:

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。问题仍然存在:为什么这会引发 AttributeError,当 For 循环清楚地声明了 cart_item,而 cart_items 显然有一个魅力列和 id 分配给所述列?

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

【问题讨论】:

  • 而不是if x ==True: elif x == False:,最好使用成语if x: else:。如果您必须确定它们是否完全等于TrueFalse,则应使用if x is True: elif x is False: 这是因为(例如)0 == False 为真,而0 is False 为假。
  • 不,我没有理由,只是原型代码中的一个愚蠢的语义错误。将修复生产。

标签: python mysql django attributeerror nonetype


【解决方案1】:

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

我对这些变量和对象类型了解不多,无法理解原因,但正是 if 条件掩盖了您的问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我应该提到错误是在第 56 行抛出的,也就是 if cart_item.charm.id == "": 行。当if cart_item.charm.id == ch.id: 没有时,为什么这条线会抛出错误?我已经从提供的 sn-p 之前和之后剪切了代码,但中间没有。我将声明添加到 sn-p 的前面。
    • @fildred13 似乎cart_item.idcharm == True 时被分配给一个对象,但在False 时却不是。
    • 我已经扩展了代码,基本上包括了整个def add_to_cart。我知道当charm == True 时,cart_item.id 被分配了一个对象,但我根本看不出为什么它是假的。就在charm 的条件测试之前,分配正在那里发生,那么第一个条件中的某些东西会破坏分配吗?
    • 经过进一步修改,实际上应该是 cart_item.charm_id 而不是 cart_item.charm.id。这个答案或多或少让我走上了这条路,因为他的推理是正确的,我只需要弄清楚作业是如何失败的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2019-02-06
    • 2016-01-29
    • 2014-12-20
    • 2018-09-07
    相关资源
    最近更新 更多