Джанго: как создавать модели, рассчитанные по другим моделям? - PullRequest
0 голосов
/ 17 марта 2019

У меня есть модели расходов и доходов. Эти две модели должны стать основой для другой модели, называемой балансом.

Где

balance.income = sum(incomes)
balance.expense = sum(expenses)
balance.rest = sum(incomes) - sum(expenses)

Как реализовать эту модель баланса в Django? Ожидается, что всякий раз, когда модели доходов и расходов получают новые данные от пользователя, баланс будет рассчитываться автоматически. Ниже приведена реализация этих моделей, но модель Balance необходимо пересмотреть (здесь, чтобы дать представление о структуре).

from django.db import models

class User(models.Model):
    user_id = models.AutoField(primary_key=True)
    firstname = models.CharField(max_length=20)
    lastname = models.CharField(max_length=20)

    def __str__(self):
        return self.firstname

class Balance(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    currency = models.CharField(max_length=3, default='$')
    income = models.IntegerField(default=0)
    expense = models.IntegerField(default=0)
    rest = models.IntegerField(default=0)
    saving = models.IntegerField(default=0)

    def __str__(self):
        return str(self.rest)

class Expense(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField()
    category = models.TextField(default='')
    detail = models.TextField(default='')
    place = models.TextField(default='')
    amount = models.FloatField(default=0.0)

    def __str__(self):
        return self.detail

class Income(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField()
    detail = models.TextField(default='')
    amount = models.FloatField(default=0.0)

    def __str__(self):
        return self.detail

1 Ответ

0 голосов
/ 17 марта 2019

Самый простой способ сделать это - переопределить метод .save().Обратите внимание, что это будет обойдено при сохранении модели через командную строку.

class Balance(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    currency = models.CharField(max_length=3, default='$')
    income = models.IntegerField(default=0)
    expense = models.IntegerField(default=0)
    rest = models.IntegerField(default=0)
    saving = models.IntegerField(default=0)

    def __str__(self):
        return str(self.rest)

    def save(self, *args, **kwargs):
        user_incomes = Income.objects.filter(user=self.user).aggregate(Sum('amount'))['amount_sum']
        user_expenses = Expense.objects.filter(user=self.user).aggregate(Sum('amount'))['amount_sum']
        self.income = user_incomes
        self.expense = user_expenses
        self.balance = user_incomes - user_expenses
        super(Balance, self).save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...