首页 > 解决方案 > Django注释一个相关对象,该对象是几个深度相关的对象

问题描述

我正在使用 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'))

任何有关如何完成此任务的建议将不胜感激!

标签: djangodjango-annotatedjango-related-manager

解决方案


推荐阅读