python - 如何在单个查询集中组合两个 django 模型对象值
问题描述
我需要一个查询集,它应该是两个模型对象的组合。请看代码
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'))
在我打电话的意见中
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=F('sub_budget'),
budget_cost=Sum('budgetactivity__cost')
)
然而,最好在BudgetSubcategory
不使用的情况下对 s 进行注释.values(..)
,因为那时您仍然使用BugetSubcategory
s,因此您仍然拥有封装在模型中的“逻辑”:
from django.db.models import F, Sum
qs2 = BudgetSubcategory.objects.annotate(
actual_cost=F('sub_budget'),
budget_cost=Sum('budgetactivity__cost')
)
推荐阅读
- assembly - MIPS 数组未存储正确的值
- javascript - 执行数组中的类实例方法(javascript)
- c# - 指针事件仅适用于 div 的一部分
- python - to_datetime 无法识别的值类型:
- react-admin - 如何在 List 资源和 Datagrid 中显示项目的 ID 而不是对象的 IRI?
- javascript - React/Javascript 比较运算符不工作
- assembly - 在 AT&T 语法中定义字节
- google-chrome - Gmail 的浏览器 WebView 如何处理 cookie?
- javascript - 按最高值(包括最高匹配值)过滤对象数组
- google-chrome-devtools - 如何更改css选项卡的位置