Группировка наборов запросов Django по полю, связанному с иностранным ключом

У меня есть модель Allotment

class Kit(models.Model):
    kit_types = (('FLC', 'FLC'), ('FSC', 'FSC'), ('Crate', 'Crate'), ('PP Box', 'PP Box'))

    kit_name = models.CharField(max_length=500, default=0)
    kit_type = models.CharField(max_length=50, default=0, choices=kit_types, blank=True, null=True)


class AllotmentFlow(models.Model):

    flow = models.ForeignKey(Flow, on_delete=models.CASCADE)
    kit = models.ForeignKey(Kit, on_delete=models.CASCADE)
    asked_quantity = models.IntegerField(default=0)
    alloted_quantity = models.IntegerField(default=0)


class Allotment(models.Model):

    transaction_no = models.IntegerField(default=0)
    dispatch_date = models.DateTimeField(default=datetime.now)
    send_from_warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
    flows = models.ManyToManyField(AllotmentFlow)

Для стекированного графика я пытаюсь получить данные о различных kit_type, выделенных в разные месяцы. Для этого я пробовал использовать annotate, но он не дает желаемых результатов

dataset = Allotment.objects.all().annotate(
            month=TruncMonth('dispatch_date')).values(
            'month').annotate(dcount=Count('flows__kit__kit_type')).values('month', 'dcount')

Ожидаемый выход:

[{'month':xyz, 'kit_type':foo, count:123},...]

Я получаю месяц и количество типов комплектов, но как мне разделить их по kit_type?

Иметь поле, которое представляет выбранные вами имена полей в этом запросе сложно вместо этого, как насчет использования аргумента фильтра Count и аннотации, чтобы получить то, что вы хотите

dataset = Allotment.objects.all().annotate(month=TruncMonth('dispatch_date')).values('month').annotate(
                FLC_count=Count('flows__kit__kit_type', filter=Q(flows__kit__kit_type="FLC")),
                FSC_count=Count('flows__kit__kit_type', filter=Q(flows__kit__kit_type="FSC")),
                Crate_count=Count('flows__kit__kit_type', filter=Q(flows__kit__kit_type="Crate")),
                PP_Box_count=Count('flows__kit__kit_type', filter=Q(flows__kit__kit_type="PP_Box")),
).values('month', 'dcount')
Вернуться на верх