Django,如何用一个负和得到方法的和

Django,如何用一个负和得到方法的和,django,django-models,django-views,django-forms,Django,Django Models,Django Views,Django Forms,如何使用agregate获得django中方法的总和?我把它用于字段,它工作得很好,但对于方法,它不返回任何内容 class Invoice(models.Model): date = models.DateField(default=timezone.now) client = models.ForeignKey('Client',on_delete=models.PROTECT) def total(self): total = self.invoi

如何使用agregate获得django中方法的总和?我把它用于字段,它工作得很好,但对于方法,它不返回任何内容

class Invoice(models.Model):
    date = models.DateField(default=timezone.now)
    client = models.ForeignKey('Client',on_delete=models.PROTECT)

    def total(self):
        total = self.invoiceitem_set.aggregate(sum=Sum('subtotal'))
        return round(total[("sum")] or 0, 2)


class InvoiceItem(models.Model):
    invoice = models.ForeignKey('Invoice', on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.PROTECT)
    price = models.DecimalField(max_digits=20, decimal_places=2)
    quantity = models.DecimalField(max_digits=20, decimal_places=2)
    
    def subtotal(self):
        return self.price * self.quantity

您不能引用方法,因为数据库不知道有关
小计的任何信息。因此,您应该使用将
价格
与数量相乘:

from django.db.models import F

class Invoice(models.Model):
    date = models.DateField(default=timezone.now)
    client = models.ForeignKey('Client',on_delete=models.PROTECT)

    def total(self):
        return round(self.invoiceitem_set.aggregate(
            sum=Sum(F('price') * F('quantity'))
        )['sum'] or 0, 2)
从django.db.models导入F
类别发票(型号.型号):
日期=型号.DateField(默认值=时区.now)
client=models.ForeignKey('client',on_delete=models.PROTECT)
def总计(自身):
返回轮(self.invoiceitem\u set.aggregate(
总和=总和(F(‘价格’)*F(‘数量’)
)['sum']或0,2)

使用
F
对象,可以引用具有该名称的字段。

ok。如果它比那个例子联系得更紧密,我指的是表x中的价格和表y中的数量,那么总和将在表z中。我担心它是否会产生一些bug或complications@youssefmohamed:您无法访问任何方法。因为在Django/Python层定义的方法在数据库级别根本不存在。数据库对模型、Django、方法等一无所知。它只有表、列等。如果您进行查询,则会将其转换为SQL,因此您只能使用数据库知道的内容。