@samuser
programmer

Как писать цикл внутри views.py в Django?

Как писать цикл внутри views.py в Django ?

def query1(request):
    genres = Genre.objects.filter(name__in=["Traditional music", "Juz"])
    ids = [g.id for g in genres]
    artists = Artist.objects.all()
    # ????
    for artist in artists:
        artist.album_count = artist.album_set.filter(genres__in=ids).count()
    # ^^^
    artists.order_by("-album_count")
    return render(request, 'joiners/joiners_1.html', {"genres":genres, "artists":artists, "ids":ids})


Как цикл for положить в переменную или вернуть значение в шаблон ?
  • Вопрос задан
  • 1228 просмотров
Решения вопроса 1
@iMrDron
Все это можно сделать при помощи аннотаций примерно так:
artists = (
    Artist.objects
    .filter(album_set__genres__name__in=["Traditional music", "Juz"])
    .annotate(album_count=Count('album_set', distinct=True))
)

В цикле делать запросы к бд недопустимо вообще! Изучите аннотации, если бывает что их возможностей не хватает, допустим нужно делать ещё промежуточные вычисления, тогда нужно идти по другому пути доставать из базы всех артистов, доставать одним запросом все альбомы для артистов отфильтрованные по genres, и уже по результатам итерироватся и считать что нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
saintbyte
@saintbyte
Django developer
Сделай метод у модели и подумай над кешированием.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы