Объект Int не является вызываемым в коде ${{order.get_cart_total}}.

У меня в модели следующий код, при вызове get_cart_total int not callable or unsupported operand type(s) for +: 'int' and 'method'appaers

Я ожидаю получить общую сумму из 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):
    
        items = self.get_cart_items()
        for item in 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

Поскольку self.get_cart_items является свойством, вызывать его не нужно. Вы можете либо удалить декоратор @property, либо просто ожидать, что self.get_cart_items будет уже целым числом, а не методом.

    @property
    def get_cart_total(self):
    
-       items = self.get_cart_items()
+       items = self.get_cart_items
        for item in items:
            total += item.get_total()
        return total

Вы задали get_cart_items как property, который рассматривается как атрибут объекта, а не как метод. Вам нужно удалить этот декоратор или () из ваших вычислений.

Вариант 1:

@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):
    items = self.get_cart_items
    for item in items:
        total += item.get_total()
    return total

Вариант 2:

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):
    items = self.get_cart_items()
    for item in items:
        total += item.get_total()
    return total
  • Ваш get_cart_items является методом свойства, который не является вызываемым, поэтому удалите (), когда вы хотите использовать этот метод
  • .
  • get_cart_items() возвращает значение int, которое является суммой количеств элементов, поэтому здесь в вашем коде items = self.get_cart_items() вы не можете циклически перебирать целочисленные значения
  • .

Исправьте свой код соответствующим образом

    @property
    def get_cart_items(self):
        return self.orderitem_set.all()

    @property
    def get_cart_total(self):
        items = self.get_cart_items
        for item in items:
            total += item.get_total()
        return total

Пара точек:

  1. 'get_cart_items' является свойством (декоратор @property), поэтому вы должны обращаться с ним как с таковым. Изменить: items = self.get_cart_items() на items = self.get_cart_items, или удалите декоратор @property.
  2. 'get_cart_items' возвращает не список объектов OrderItem, а сумму количества товаров (целое число)
  3. .
  4. Переменная 'total' не инициализируется в методе 'get_cart_total'.

Попробуйте что-нибудь вроде этого для метода 'get_cart_total':

def get_cart_total(self):
    total = 0
    for item in self.orderitem_set.all():
        total += item.get_total()
    return total
Вернуться на верх