如何在单个查询集中组合两个 Django 模型对象值
How to combine two django model objects values in a single queryset
我需要一个查询集,它应该是两个模型对象的组合。
请看代码
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=<b>F(</b>'sub_budget'<b>)</b>,
<b>budget_cost=Sum('budgetactivity__cost')</b>
)
然而,使用 .values(..)
注释 BudgetSubcategory
而不使用 可能更好,因为那时你仍然使用 BugetSubcategory
s,并且因此,您仍然拥有封装在模型中的 "logic":
from django.db.models import F, Sum
qs2 = BudgetSubcategory.objects.annotate(
actual_cost=F('sub_budget'),
budget_cost=Sum('budgetactivity__cost')
)
我需要一个查询集,它应该是两个模型对象的组合。 请看代码
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=<b>F(</b>'sub_budget'<b>)</b>,
<b>budget_cost=Sum('budgetactivity__cost')</b>
)
然而,使用 .values(..)
注释 BudgetSubcategory
而不使用 可能更好,因为那时你仍然使用 BugetSubcategory
s,并且因此,您仍然拥有封装在模型中的 "logic":
from django.db.models import F, Sum
qs2 = BudgetSubcategory.objects.annotate(
actual_cost=F('sub_budget'),
budget_cost=Sum('budgetactivity__cost')
)