Django 注释一个相关对象,该对象是几个深度相关的对象

时间:2021-03-23 05:15:27

标签: django django-annotate django-related-manager

我正在使用 Python/Django 构建预算/财务跟踪应用程序。我试图弄清楚如何注释一些关系很深的几个对象的对象。我正在尝试注释我的“ExpenseBudgetItem”对象以包括交易总额和花费总额,以便我可以在我的预算页面上显示它。我的问题是我不知道如何实现这一点。下面是我的 models.py 文件的片段,下面是我尝试过的。

# models.py

class BudgetPeriod(models.Model):  # A month to represent a budget period
    month = models.IntegerField(choices=CHOICES, default=datetime.today().month)
    year = models.PositiveIntegerField(default=datetime.today().year)

# Expense Models
class ExpenseCategory(models.Model):  # Ex: Entertainment can be an expense category
    budget_period = models.ForeignKey('BudgetPeriod', on_delete=models.CASCADE, related_name='expense_categories')
    name = models.CharField(max_length=50)

class ExpenseBudgetItem(models.Model):  # Ex: Golf, movies, games can be budget items of entertainment
    expense_category = models.ForeignKey('ExpenseCategory', on_delete=models.CASCADE, related_name='expense_budget_items')
    name = models.CharField(max_length=50)
    planned_amount = models.DecimalField(max_digits=9, decimal_places=2)

class ExpenseTransaction(models.Model):  # Ex: All of my expense transactions for each of those budget items
    expense_budget_item = models.ForeignKey('ExpenseBudgetItem', on_delete=models.CASCADE, related_name='expense_transactions')
    name = models.CharField(max_length=50)
    amount = models.DecimalField(max_digits=9, decimal_places=2)

# Income Models - Note: I did not make an income category model like I did for expenses
class IncomeBudgetItem(models.Model):  # Ex: Paychecks, Income income category like expenses
    budget_period = models.ForeignKey('BudgetPeriod', on_delete=models.CASCADE, related_name='income_budget_items')
    name = models.CharField(max_length=50)
    planned_amount = models.DecimalField(max_digits=9, decimal_places=2)

class IncomeTransaction(models.Model):  # Ex: Paycheck 1, Paycheck 2
    budget_item = models.ForeignKey('IncomeBudgetItem', on_delete=models.CASCADE, related_name='income_transactions',)
    name = models.CharField(max_length=50)
    amount = models.DecimalField(max_digits=9, decimal_places=2)
    date = models.DateField()

我成功地注释了我的收入预算项目,为此我做了以下工作:

income = bp.income_budget_items.annotate(total_received=(Sum('income_transactions__amount') or 0), total_transactions=Count('income_transactions'))

但是当我尝试注释费用预算项目时,我找不到正确的注释方法,因为我必须引用的关系中有一个额外的模型 (ExpenseCategory)。这是我尝试过但失败的两个例子:

expenses = bp.expense_categories.all().expense_budget_items.annotate(total_spent=(Sum('expense_transactions__amount') or 0), total_transactions=Count('expense_transactions'))

expenses = bp.expense_categories.select_related('expense_budget_items').annotate(total_spent=(Sum('expense_transactions__amount') or 0), total_transactions=Count('expense_transactions'))

关于如何实现这一点的任何建议将不胜感激!

0 个答案:

没有答案
相关问题