Запрос Django ORM к трем таблицам с итоговыми значениями

У меня есть три таблицы CATEGORIES, TIPODESPESA и EXPENSE. Я хотел бы выполнить более простой и быстрый запрос, чтобы вернуть общие расходы, сгруппированные по ТИПОДЕСПЕЗАМ и по КАТЕГОРИЯМ. Ожидаемый результат будет таким, как показано ниже: введите описание изображения здесь

Хотелось бы получить результат, в котором итоги сгруппированы сначала по КАТЕГОРИЯМ, затем по ТИПАМ РАСХОДОВ и затем показаны РАСХОДЫ.

Однако, чтобы я мог это сделать, я выполняю следующие запросы, приведенные ниже, и я пытаюсь упростить и сделать это быстрее, но я все еще изучаю некоторые вещи. Если вы можете помочь с запросом.

registros = CategoriaDespesa.objects.filter(
    tipodespesas__tipodespesa_movimentodespesa__data__lte=data_final,
    tipodespesas__tipodespesa_movimentodespesa__data__gte=data_inicio, ) \
    .order_by('description')


categorias_valores = CategoriaDespesa.objects.filter(
    tipodespesas__tipodespesa_movimentodespesa__data__lte=data_final,
    tipodespesas__tipodespesa_movimentodespesa__data__gte=data_inicio,
    tipodespesas__tipodespesa_movimentodespesa__company=company.company) \
    .values('id').annotate(total=Coalesce(Sum(
    F("tipodespesas__tipodespesa_movimentodespesa__valor"), output_field=FloatField()), 0.00))

tipos_valores = TipoDespesa.objects.filter(
    tipodespesa_movimentodespesa__data__lte=data_final,
    tipodespesa_movimentodespesa__data__gte=data_inicio,
    tipodespesa_movimentodespesa__company=company.company).values('id') \
    .annotate(total=Coalesce(Sum(F("tipodespesa_movimentodespesa__valor"), output_field=FloatField()), 0.00))

Классы, которые я использую:

class CategoriaDespesa(models.Model):
    description = models.CharField(max_length=200, help_text='Insira a descrição')
    active = models.BooleanField(default=True, help_text='Esta ativo?', choices=CHOICES)
    user_created = models.ForeignKey(User, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class TipoDespesa(models.Model):
    category = models.ForeignKey(
        CategoriaDespesa, on_delete=models.CASCADE, related_name="tipodespesas")
    description = models.CharField(max_length=200, help_text='Insira a descrição')
    active = models.BooleanField(default=True, help_text='Esta ativo?', choices=CHOICES)
    user_created = models.ForeignKey(User, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Despesa(models.Model):
    company = models.ForeignKey(
        Company, on_delete=models.CASCADE, related_name="companies_movimentodespesa")
    tipodespesa = models.ForeignKey(
        TipoDespesa, on_delete=models.CASCADE, related_name="tipodespesa_movimentodespesa")
    description = models.CharField(
        max_length=200, help_text='Insira a descrição')
    data = models.DateField(help_text="Data do Movimento",
                            default=datetime.now, blank=False)
    valor = models.DecimalField(
        max_digits=8, decimal_places=2, default=0.00, help_text='Valor')
    user_created = models.ForeignKey(User, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


Моя цель - создать отчет, который показывает уровни и суммированные значения по уровням.

Вернуться на верх