Агрегирование аннотированного набора запросов с подзапросами в Django 1.11 - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь агрегировать общую стоимость модели акций, сгруппированных по дате.Глядя на документы Django, я вижу, что мне нужно позвонить на .values('date') (чтобы Django делал аннотацию, группирующую набор запросов по дате), а затем мою аннотацию.Набор запросов включает в себя два подзапроса:

            prices = Quote.objects.filter(
                date=OuterRef('date'),
                asset=OuterRef('asset')
            ).order_by().values('price')
            usd_prices = Quote.objects.filter(
                asset__ticker='USDCLP',
                date=OuterRef('date'),
            ).order_by().values('price')
            shares_data = DailyShares.objects.filter(
                account=account,
                date__gte=start_date,
            ).order_by().annotate(
                price=Subquery(prices),
                usd_price=Subquery(usd_prices),
                clp_value=Case(
                    When(
                        asset__currency=Asset.USD,
                        then=F('quantity') * F('price') * F('usd_price')
                    ),
                    default=F('quantity') * F('price'),
                    output_field=models.DecimalField(),
                ),
            ).values(
                'date',
            ).annotate(
                total_value=Sum('clp_value')
            )

Проблема в том, что при этом выдается KeyError: 'clp_value', я не могу получить доступ к аннотации после вызова .values('date').Если я добавлю clp_value к вызову .values(), я прерву группирование, потому что Django попытается сгруппировать по уникальным парам (date, clp_value), что я не пытаюсь сделать.

Есть идеи?

...