Джанго: Аннотировать через три модели - PullRequest
0 голосов
/ 09 октября 2018

Я хотел бы сделать сложный annotate вызов по QuerySet, и я не знаю, как его построить.Не могли бы вы помочь?

Я попытаюсь упростить мои настройки:

У меня есть 3 модели: Movie, Actor и Casting.

Каждая Casting имеет внешний ключ для Movie и Actor, а CharField для role.

Например, Casting может означать, что Джонни Депп сыграл Джека Воробья в ПиратахКарибского моря.

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

Обратите внимание, что я даю конкретного актера, я не хочу обойти всех актеров.

1 Ответ

0 голосов
/ 09 октября 2018

Вы можете .annotate(..) это с Case(..) объектом:

Movie.objects.annotate(
    role=Min(Case(
        When(casting__actor=my_actor, then=F('casting__role')),
        default=None
    ))
)

Теперь у Movie объектов будет атрибут .role, который содержит role для этого актера.

Если у актера есть несколько ролей, он возьмет наименьшую лексикографическую роль, если такого актера нет, потребуется None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...