Как получить продукты с наивысшим рейтингом в следующем случае?

Я использую Django==3.2 и Django-rest-framework==3.12.4 . У меня есть два модала со следующими именами Product и ProductRating.

Как вы можете видеть ниже


class Product(models.Model):


   
    user = models.ForeignKey(User,related_name='userprofile', on_delete=models.CASCADE)
    
    name = models.CharField(("name"), max_length=50,null=True, blank=True)
    price = models.IntegerField(_("price"),default=0)
    create_time = models.DateTimeField(_("Create time"), default=timezone.now)




class ProductRating(models.Model):

    user = models.ForeignKey(User, verbose_name=_("user"), on_delete=models.CASCADE,null=True,blank=True)
    product = models.ForeignKey(Product, verbose_name=_("product"), on_delete=models.CASCADE)
    stars = models.IntegerField(_("stars"),default=0)
    is_remove = models.BooleanField(_("is_remove"),default=False)
    create_time = models.DateTimeField(_("Create time"), default=timezone.now)

Теперь я хочу получить продукты с наивысшим рейтингом. В соответствии со средним рейтингом каждого продукта, продукт, который имеет самый высокий рейтинг и наибольшее количество отзывов, должен появляться первым в списке запросов. Я пробовал следующее, но это дало мне только те продукты, у которых есть какой-либо элемент рейтинга. Как вы можете видеть ниже.

def get_all_top_rated_projects(self):
        query = self.filter(productrating__isnull=False)
        print( query[0].productrating.object.all())

Я знаю, что это довольно сложное дело. Я пытался сделать это самостоятельно. Но у меня не получается. Кто-нибудь из экспертов может помочь и вытащить меня из этой ситуации. Большое спасибо заранее.

Вы можете использовать Avg функцию базы данных

from django.db.models import Avg, Q

Product.objects.annotate(avg_rate=Avg("product__stars", filter=Q(product__is_remove=False))).order_by("avg_rate")
Вернуться на верх