Как получить кверисет, который мне нужен?

у меня есть 2 модели

class Task(models.Model):
    user = models.ForeignKey(
        to='users.User',
        on_delete=models.CASCADE,
        related_name='tasks',
    )
    category = models.ForeignKey(
        to='TaskCategory',
        on_delete=models.CASCADE,
        related_name='tasks',
        blank=True,
        null=True,
    )
    difficult = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        validators=(MinValueValidator(Decimal('0.01')),),
    )


class TaskCategory(models.Model):
    user = models.ForeignKey(
        to='users.User',
        on_delete=models.CASCADE,
        related_name='task_categories',
    )
    name = models.CharField(
        max_length=255,
    )

я хочу получить этот запрос (получить сумму 3 самых сложных категорий и следующую за ней сумму других):

[ { "category__name": "Еда", "category_sum": "12477.00" }, { "category__name": "Покупки", "category_sum": "3214.00" }, { "category__name": "Кино", "category_sum": "2590.00" }, { "category__name": "Другие", "category_sum": "2000.00" }

]

я создаю этот кверисет, но я не знаю как сделать кверисет, который я хочу:

Task.objects.values('category__name').annotate(
                category_sum=Coalesce(
                    Sum('difficult'),
                    0,
                    output_field=DecimalField()
                )
            ).filter(
              category__isnull=False
             ).order_by('-category_sum')

[ { "category__name": "Еда", "category_sum": "12477.00" }, { "category__name": "Покупки", "category_sum": "3214.00" }, { "category__name": "Кино", "category_sum": "2590.00" }, { "category__name": "Спорт", "category_sum": "1000.00" } { "category__name": "Дом", "category_sum": "1000.00" }

]

Если вы хотите ограничить набор запросов 3 строками, просто добавьте [:3], как:

Task.objects.values('category__name').annotate(
            category_sum=Coalesce(
                Sum('difficult'),
                0,
                output_field=DecimalField()
            )
        ).filter(
          category__isnull=False
         ).order_by('-category_sum')[:3]

вот и все

Больше примеров о нарезке списков в python: https://www.programiz.com/python-programming/examples/list-slicing

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