Как получить кверисет, который мне нужен?
у меня есть 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