使用django ORM获取评级数据的最佳方式



我有一个serializer,它有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.")

这将导致单个数据库命中,并在数据库内执行计数,这要快得多。

最新更新