You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型调用get_cart_total报错:Int object is not callable等问题排查

问题分析与修复

错误原因

  1. Int object is not callable:get_cart_items被@property装饰为属性,而非方法,调用时不能加()。你写了items = self.get_cart_items(),相当于把返回的整数当成方法调用,直接触发该错误。
  2. 逻辑混淆:get_cart_items返回的是购物车商品总数量(整数),不是OrderItem对象列表,你却尝试循环这个整数,后续调用item.get_total()时自然触发类型错误。
  3. 变量未初始化: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:55:21