django - 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'))
任何有关如何完成此任务的建议将不胜感激!
解决方案
推荐阅读
- vba - 用于格式化特定范围内停止的 VBA
- spring-cloud - 在开发环境注册多个同名微服务实例
- python - Docker - 安装烧瓶失败
- javascript - addEventListener 和 removeEventListener 在 Firefox/Chrome 与 Edge 中的不同行为
- java - 打印书籍的类型
- firebase - Firebase admin SDK 可以检索用户身份验证令牌吗?
- php - BlueSnap - 托管支付字段令牌
- python - 将列表元素的两个不同部分存储到另一个列表中
- java - 无法在 Eclipse IDE 中下载 CrudRepository 源 - 找不到源
- python - 如何从 Windows Shell 启动 python 脚本?