Django: значение аннотации на основе связанного набора - PullRequest
0 голосов
/ 28 декабря 2018

Я ищу способ аннотировать значение агрегированного отфильтрованного связанного набора.

class Location(...
    ...

class Ticket(...
    location = ForeignKey(Location...)
    date = ...
    price = ...

Мне нужно аннотировать максимальную цену билета в диапазоне дат.

Так что, если я установлю только последние 30 дней, он возвращает мне все Location объекты и каждый объект имеет значение max_price'аннотация, равная максимальной цене билетов за последние 30 дней.

Билеты:

<Ticket France 100 now-50days>
<Ticket France 200 now-20days->
<Ticket France 300 now-20days>
<Ticket Austria 200 now-10days>
<Ticket Austria 50 now-10days>

В этом случае набор запросов возвращает:

<Location France> + annotated 200
<Location Austria> + annotated 50

Является ли этоможно сделать это за один Query?

1 Ответ

0 голосов
/ 28 декабря 2018

Это должно сработать:

from django.db.models import Case, Max, Q
date = datetime.datetime.today() - datetime.timedelta(days=30)

events = Locations.objects.annotate(
    max_price=Max('ticket_set__price', filter=Q(ticket_set__date__gte=date))
)

Обратите внимание, что я использую ticket_set здесь, потому что я не знаю, есть ли у вас related_name на внешнем ключе или нет.Если у вас есть связанное имя, например tickets, используйте его вместо ticket_set.

...