Лучший способ получения данных о рейтинге с помощью django ORM

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

def get_rates(self, obj):
    reviews = Review.objects.filter(driver=obj)
    rate_5 = reviews.filter(customer_rate__gt=4, customer_rate__lte=5).count()
    rate_4 = reviews.filter(customer_rate__gt=3, customer_rate__lte=4).count()
    rate_3 = reviews.filter(customer_rate__gt=2, customer_rate__lte=3).count()
    rate_2 = reviews.filter(customer_rate__gt=1, customer_rate__lte=2).count()
    rate_1 = reviews.filter(customer_rate__gt=0, customer_rate__lte=1).count()
    return {
        'rate_5': rate_5,
        'rate_4': rate_4,
        'rate_3': rate_3,
        'rate_2': rate_2,
        'rate_1': rate_1,
    }
from django.db.models import Count, Q

def get_rates(self, obj):
    reviews = Review.objects.filter(driver=obj).annotate(
        rate_5=Count('pk', filter=Q(customer_rate__gt=4),
        rate_4=Count('pk', filter=Q(Q(customer_rate__gt=3) & Q( customer_rate__lte=4))),
        rate_3=Count('pk', filter=Q(Q(customer_rate__gt=2) & Q( customer_rate__lte=3))),
        rate_2=Count('pk', filter=Q(Q(customer_rate__gt=1) & Q( customer_rate__lte=2))),
        rate_1=Count('pk', filter=Q(customer_rate__lte=1),
    )
    
    # example
    for review in reviews:
        print(f"{review} has {review.rate_4} three to four star ratings.")

это приведет к одному обращению к БД и выполнит подсчет внутри БД, что намного быстрее.

Вернуться на верх