python - 如何在单个查询集中组合两个 django 模型对象值

标签 python django django-models django-views django-orm

我需要一个查询集,它应该是两个模型对象的组合。 请看代码

models.py

class BudgetSubcategory(models.Model):
    sub_category = models.CharField(
        _("Sub Category"), max_length=255, default=False)
    sub_budget = models.DecimalField(
        _("Budget"), max_digits=15, decimal_places=2, default=Decimal('0.0000'))

class BudgetActivity(models.Model):
    sub_category = models.ForeignKey(BudgetSubcategory, on_delete=models.CASCADE)
    activity = models.CharField(
        _("Activity"), max_length=255, default=False)
    cost = models.DecimalField(
        _("Cost"), max_digits=15, decimal_places=2, default=Decimal('0.0000'))

在我正在调用的 View 中

qs1 = BudgetActivity.objects.values('activity').annotate(budget_cost=Sum('cost'))
qs2 = BudgetSubcategory.objects.values('sub_category').annotate(
      actual_cost=Sum('sub_budget'))

q1 将是

[{'activity': 'activity1', 'budget_cost': Decimal('300.00')},
 {'activity': 'activity2', 'budget_cost': Decimal('2000.00')}]

q2 将是

[{'sub_category': 'sub_category1', 'actual_cost': Decimal('500.00')}, 
{'sub_category': 'sub_category2', 'actual_cost': Decimal('2300.00')}]

但我需要的是

[{'sub_category': 'sub_category1', 'actual_cost': Decimal('500.00'),
 'budget_cost': Decimal('300.00')}, {'sub_category': 'sub_category2',
 'actual_cost': Decimal('2300.00'),'budget_cost': Decimal('2000.00')}]

请帮助我解决这个问题

最佳答案

您可以使用双下划线 (__) 对相关对象进行注释:

from django.db.models import F, Sum

qs2 = BudgetSubcategory.objects.values(
    'sub_category'
).annotate(
    actual_cost=<b>F(</b>'sub_budget'<b>)</b>,
    <b>budget_cost=Sum('budgetactivity__cost')</b>
)

但是,最好使用 .values(..) 来注释 BudgetSubcategory 而不,因为这样您仍然可以使用 BugetSubcategorys,因此您仍然拥有封装在模型中的“逻辑”:

from django.db.models import F, Sum

qs2 = BudgetSubcategory.objects.annotate(
    actual_cost=F('sub_budget'),
    budget_cost=Sum('budgetactivity__cost')
)

关于python - 如何在单个查询集中组合两个 django 模型对象值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535131/

相关文章:

python - 最小化多变量函数

python - 使用 Cookiecutter Django 将字段添加到自定义用户模型

python - Django:使用 SQL 手动更改模型字段有哪些缺点?

django - 筛选 PointField 的查询集字段以查找特定距离范围内的项目不正确

python - 你如何在 Python 中打印上标?

Python:反向替换函数

Python:url 内容的简单异步下载?

python - django:无法将模型导入到与模型相同路径上的.py

django - AllAuth 安装

django - 我可以让 Django 忽略非 PK 唯一约束上的重复装置吗?