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',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',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',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',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'))

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)