如何使用Django计算DEF总数?

2024-06-18 18:50:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算客户端的总余额,我用def做了这个类,但是它只计算一个客户端,我想创建一个def来计算我所有客户端的client_balance总数

class ClientsBalance(models.Model):
    client = models.OneToOneField(Client, on_delete=models.CASCADE,related_name='Client')

    def sales(self):
        invoices = self.client.invoice_set.all()
        sales_amount = 0
        for invoice in invoices:
            sales_amount += invoice.amountDuettc()
        return sales_amount

    def clientpayment(self):
        invoices = self.client.invoice_set.all()
        clientpayment = 0
        for invoice in invoices:
            clientpayment += invoice.amount_paid()
        return clientpayment

    def client_balance(self):
        items = self.client.invoice_set.all()
        invoice_balance = 0
        for item in items:
            invoice_balance = (self.sales()) - (self.clientpayment()) + (item.client.initialBalance)
        return invoice_balance

Tags: inselfclient客户端formodelsdefinvoice
2条回答

首先,函数中有一个输入错误,使得每次迭代都覆盖invoice_balance

这将根据需要返回总和:

def client_balance(self):
    items = self.client.invoice_set.all()
    invoice_balance = 0
    for item in items:
        invoice_balance += (self.sales()) - (self.clientpayment()) + (item.client.initialBalance)
    return invoice_balance

第二,如果需要,您可以合并您的逻辑,因为您始终使用相同的查询集,例如:

def calculations(self):

    queryset = self.client.invoice_set.all()

    sales_amount = 0
    clientpayment = 0
    invoice_balance = 0

    for client in queryset:
        sales_amount += client.amountDuettc()
        clientpayment += client.amount_paid()
        invoice_balance += client.amountDuettc() - client.clientpayment() + client.client.initialBalance()

    context = {
        'sales_amount': sales_amount,
        'clientpayment': clientpayment,
        'invoice_balance': invoice_balance
    }

    return context

您当前的逻辑正在返回最后一个客户端的余额。在每次迭代中,发票余额覆盖上一个值

试试这个。 初始化空字典并在每次迭代中追加字典:

def client_balance(self):
    items = self.client.invoice_set.all()
    invoice_dict = {}
    for item in items:
        invoice_balance = (self.sales()) - (self.clientpayment()) + (item.client.initialBalance)
        invoice_dict[client_pk] = invoice_balance # client_pk is something unique for client.
    return invoice_dict

这将返回一个字典,其中包含每个客户端的发票余额

相关问题 更多 >