Джанго - Как запросить последние отдельные строки до даты вступления в силу? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть модель, полная эффективных дат.Известные поля для этих ставок: name, type, effective_date и rate.

. Мне нужно иметь возможность фильтровать частоты модификаторов, чтобы получать только ставки определенного типа и раньше.определенная дата.

ModifierRate.objects.filter(
                type=settings.MODIFIER_RATE_TYPES_TAX,
                effective_date__lte=date)

Этот запрос может возвращать ставки с одинаковыми name и type, поэтому мне нужно, чтобы они различались в этих двух полях.

.distinct('name', 'type')`

Однако, если есть повторяющееся имя и тип, мне нужно самое последнее.

.order_by('-effective_date')

После всего, что мне нужно агрегировать Сумма ставок по этим объектам.

.aggregate(rate__sum=Coalesce(Sum('rate'), 0))['rate_sum']

Если япопробуйте и разбить все это вместе, я получаю

    raise NotImplementedError("aggregate() + distinct(fields) not implemented.")
NotImplementedError: aggregate() + distinct(fields) not implemented.

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

Как получить сумму ставок до определенной даты, которые различаются по имени и типу полей, где используется самая последняя отдельная ставка?

Спасибо.

1 Ответ

0 голосов
/ 17 апреля 2019

Вы можете использовать django Выражения подзапроса , подробности читайте по ссылке.

most_recent = ModifierRate.objects.filter(
    name=OuterRef('name'), 
).order_by(
    '-effective_date'
)

result = ModifierRate.objects.filter(
    type=settings.MODIFIER_RATE_TYPES_TAX,
    effective_date__lte=date
    pk=Subquery(most_recent.values('pk')[:1])
).aggragate(
    rate__sum=Coalesce(Sum('rate'), 0)
)['rate_sum']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...