【问题标题】:How to combine two django model objects values in a single queryset如何在单个查询集中组合两个 django 模型对象值
【发布时间】:2020-04-19 10:52:56
【问题描述】:

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

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

第一季度将是

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

第二季度将是

[{'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')}]

请帮我解决这个问题

【问题讨论】:

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


    【解决方案1】:

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

    from django.db.models import F, Sum
    
    qs2 = BudgetSubcategory.objects.values(
        'sub_category'
    ).annotate(
        actual_cost=F('sub_budget'),
        budget_cost=Sum('budgetactivity__cost')
    )

    然而,使用.values(..) 注释BudgetSubcategory 可能会更好不使用,因为那时您仍然使用BugetSubcategorys,因此您仍然拥有封装的“逻辑”在模型中:

    from django.db.models import F, Sum
    
    qs2 = BudgetSubcategory.objects.annotate(
        actual_cost=F('sub_budget'),
        budget_cost=Sum('budgetactivity__cost')
    )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多