Сложная аннотация запроса для каждого отдельного - PullRequest
0 голосов
/ 15 мая 2018

В представлении списка PurchaseOrder я бы хотел отобразить общее количество quantity, сгруппированное по каждому отдельному unit. Я использую следующие модели и функции, но каждый раз, когда вызывается get_quantity_by_unit(), происходит сбой базы данных - для каждого объекта в списке.

class PurchaseOrder(models.Model):
    lines = models.ManyToManyField(
        Product, blank=True, through='PurchaseOrderLine' related_name='%(class)s_line')

    def get_quantity_by_unit(self):
        return PurchaseOrderLine.objects.filter(purchase_order=self).values(
           'unit__abbreviation').annotate(sum=Sum('quantity'))

class PurchaseOrderLine(models.Model):
    purchase_order = models.ForeignKey(PurchaseOrder)
    product = models.ForeignKey(Product)
    quantity = models.DecimalField()
    unit = models.ForeignKey(Unit)

Можно ли этого достичь с помощью django orm?

Следующее получает общее количество, но не для каждого отдельного unit:

query = PurchaseOrder.objects.filter(date__gte=cutoff_date).annotate(
    total=Sum('purchaseorderline_order__quantity'))

следующие броски ValueError: Prefetch querysets cannot use values().

queryset = PurchaseOrderLine.objects.values(
    'unit').order_by('unit').annotate(total=Sum('quantity'))
query = PurchaseOrder.objects.filter(date__gte=cutoff_date).prefetch_related(
    Prefetch('purchaseorderline_order', queryset=queryset, to_attr='totals'))
...