TypeError: неподдерживаемые типы операндов для +: 'int' и 'NoneType' возвращаемая длина - PullRequest
1 голос
/ 09 мая 2019

Мой метод представления принимает значения и методы оценки вызовов, но мой терминал выводит эту ошибку>

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 ]

1 голос
/ 09 мая 2019

self.cart.values() имеет несколько элементов, количество которых равно None

Вы можете суммировать только те товары, у которых нет количества None, используя оператор if

return sum(item['quantity'] for item in self.cart.values() if item['quantity'])
1 голос
/ 09 мая 2019

За занавесом sum(..) вызовет оператор + для расчета суммы предметов.

Если один из item['quantity'] s равен None, то, конечно, ситуацияразворачивается там, где вы добавляете int с None, отсюда и ошибка.

Вы можете исправить это, отфильтровав по None (и нулю, например) с помощью:

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

Хотя, вероятно, полезно посмотреть , почему есть в этих словарях None, и, таким образом, предотвратить "заражение" словарей None s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...