Джанго Агрегат из 3 моделей с 2 ​​отношениями ManyToMany - PullRequest
2 голосов
/ 29 октября 2019

У меня есть следующая структура Django Models:

enter image description here

User имеет отношение ManyToMany к Genre иMovie также имеет отношение ManyToMany к Genre.

Я хочу добиться запроса, который извлекает только пользователей, которые имеют доступные жанрывместе с их фильмами (фильмы будут иметь разные значения). Таким образом, результат будет выглядеть следующим образом:

 [{user_id: 1, movies_ids: [1, 2, 3]}, {user_id: 7, movies_ids: [2, 3]}, {user_id: 13, movies_ids: [5, 6, 7]}]

Я ищу оптимальное решение, так как число пользователей, а также фильмов очень велико.

1 Ответ

0 голосов
/ 29 октября 2019

Я думаю, вы могли бы получить это, используя что-то вроде:
users = User.objects.filter(genre__isnull=False, genre__movie__isnull=False) и после этого перебирайте пользователей, чтобы получить user.genre.movie, и это будет делать запрос на каждой итерации.

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

Вопрос, который может помочь, здесь: Django prefetch_related children of children

...