@dert2313

Как реализовать данный запрос?

У меня есть 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 категории (с суммой сложности задач), и еще одну в которой в name выводить - 'другое' и в tasks_sum - их общую сумму сложности (категорий, которые не вошли в топ 3).
Сейчас у меня получается следующее:

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


И следующий вывод (вывожу только необходимые поля):
[
    {
        "name": "Работа",
        "category_sum": "124.00"
    },
    {
        "name": "Домашние дела",
        "category_sum": "110.00"
    }
    {
        "name": "Работа",
        "category_sum": "100.00"
    },
    {
        "name": "И еще другая*",
        "category_sum": "54.00"
    },
    {
        "name": "И какая-то)",
        "category_sum": "30.00"
    },
]


Мне нужно что-то вроде этого:

[
    {
        "name": "Работа",
        "category_sum": "124.00"
    },
    {
        "name": "Домашние дела",
        "category_sum": "110.00"
    }
    {
        "name": "Работа",
        "category_sum": "100.00"
    },
    {
        "name": "Другое",
        "category_sum": "84.00"
    },
]
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Через QuerySet.raw() если только.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы