TypeError:+不支持的操作数类型:“ int”和“ NoneType”返回长度

时间:2019-05-09 15:22:05

标签: python django

我的视图方法接受值和调用分数方法,但是我的终端输出此错误>

return sum(item['quantity'] for item in self.cart.values())
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

views.py

def cart_update(request):
    cart = Cart(request)

    quantity = request.GET.get('quantity')
    product_slug = request.GET.get('product_slug')

    product = Product.objects.get(slug=product_slug)
    cart.add(product=product, quantity=quantity, update_quantity=True)

    return JsonResponse({ # here errors
        'cart_length':cart.get_length(),
        'cart_total':cart.get_total_price(), 
        'cart_price':cart.get_price(product=product, quantity=quantity)
    })

cart.py

def get_total_price(self):
    return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())

def get_price(self, product, quantity):
    return quantity * Decimal(product.price)

def get_length(self):
    return sum(item['quantity'] for item in self.cart.values())

我做错了什么?

2 个答案:

答案 0 :(得分:1)

在窗帘后面,sum(..)将调用+运算符来计算项的总和。

如果item['quantity']中的一个是None,那么当然会出现这样的情况:您将intNone相加,从而出现错误。

您可以通过以下方法过滤None(例如零)来解决此问题:

sum(filter(None, (item['quantity'] for item in self.cart.values())))

尽管看起来为什么其中有None可能是有益的,因此可以防止字典被None s“污染”。 / p>

答案 1 :(得分:1)

self.cart.values()中有一些元素的数量为None

使用None语句只能对数量不为if的商品求和

return sum(item['quantity'] for item in self.cart.values() if item['quantity'])