Как получить продукты с наивысшим рейтингом в следующем случае?
Я использую 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")