Как рассчитать общее количество дефектов, используя django? - PullRequest
1 голос
/ 12 июля 2020

Я хотел бы рассчитать общий баланс клиентов, я сделал этот класс с 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

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Прежде всего, у вас есть опечатка в вашей функции, которая заставляет каждую итерацию перезаписывать 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

Во-вторых, вы при необходимости можно объединить ваши logi c, поскольку вы всегда используете один и тот же набор запросов, например:

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
0 голосов
/ 12 июля 2020

Ваш текущий логи c возвращает баланс последнего клиента. На каждой итерации invoice_balance переопределяет предыдущее значение.

Попробуйте это. Инициализировать пустой словарь и добавлять словарь на каждой итерации:

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

Это вернет словарь с балансом счета-фактуры каждого клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...