Запрос 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)
Моя цель - создать отчет, который показывает уровни и суммированные значения по уровням.