Django模型调用get_cart_total报错:Int object is not callable等问题排查
问题分析与修复
错误原因
Int object is not callable:get_cart_items被@property装饰为属性,而非方法,调用时不能加()。你写了items = self.get_cart_items(),相当于把返回的整数当成方法调用,直接触发该错误。- 逻辑混淆:
get_cart_items返回的是购物车商品总数量(整数),不是OrderItem对象列表,你却尝试循环这个整数,后续调用item.get_total()时自然触发类型错误。 - 变量未初始化:
get_cart_total里的total未初始化为0,直接执行total += ...会报变量未定义错误。
修复后的代码
方案一:直接调整get_cart_total逻辑
class Order(models.Model): customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True) date_ordered = models.DateTimeField(auto_now_add=True) complete = models.BooleanField(default=False, null=True, blank=False) transaction_id = models.CharField(max_length=200, null=True) def __str__(self): return str(self.id) @property def get_cart_items(self): orderitems = self.orderitem_set.all() total = sum([item.quantity for item in orderitems]) return total @property def get_cart_total(self): # 直接获取OrderItem对象列表,不依赖get_cart_items order_items = self.orderitem_set.all() total = 0 # 初始化总金额 for item in order_items: total += item.get_total() return total class OrderItem(models.Model): ORDER_ITEM_TYPE = ( ('type1', 'Collection1'), ('type2', 'Collection2'), ) order = models.ForeignKey(Order, on_delete=models.CASCADE) collection_type = models.CharField(max_length=255, choices=ORDER_ITEM_TYPE) collection1 = models.ForeignKey(Collection1, on_delete=models.SET_NULL, null=True, blank=True) collection2 = models.ForeignKey(Collection2, on_delete=models.SET_NULL, null=True, blank=True) quantity = models.IntegerField() def get_total(self): if self.collection_type == "type1": return self.collection1.price * self.quantity elif self.collection_type == "type2": return self.collection2.price * self.quantity
方案二:新增订单条目列表属性(保留原get_cart_items功能)
class Order(models.Model): # 其他字段不变 @property def get_cart_items(self): orderitems = self.orderitem_set.all() total = sum([item.quantity for item in orderitems]) return total @property def order_items(self): # 新增属性,返回OrderItem对象列表 return self.orderitem_set.all() @property def get_cart_total(self): total = 0 for item in self.order_items: # 调用属性无需加括号 total += item.get_total() return total # OrderItem类代码不变
额外优化
可以用生成器表达式简化get_cart_total计算,提升效率:
@property def get_cart_total(self): return sum(item.get_total() for item in self.orderitem_set.all())
内容的提问来源于stack exchange,提问作者Sumit James
相关产品推荐
相关产品推荐

