Выставление среднего рейтинга для одного продукта - возможно, это простое решение, но не могу найти проблему

Я пытаюсь отобразить средний рейтинг для данного отдельного продукта из всех оценок, сделанных пользователями для этого отдельного продукта.

Что мне и удалось сделать. Однако мой код, похоже, отображает все продукты и связанные с ними отзывы, а не только конкретный продукт.

Очевидно, что я где-то указываю коду, чтобы он отображал все продукты вместо одного. Но я не очень уверен, где именно. Я думаю, что это происходит из кода в моем views.py.

Нужно также уточнить, на той же странице я пытаюсь отобразить:

  1. Средний отзыв на продукт (это то, над чем я работаю)
  2. Все отзывы от разных пользователей о конкретном продукте (это работает)

Именно 2. создает проблему? Должен ли я также сделать ссылку на product_id во второй строке представления? (если да, то где?)

Модели

class Product(models.Model):
    name = models.CharField('Product Name', max_length=120, null=True)
    class Meta:
        db_table='Product'
    def __str__(self):
        return str(self.name)

class ReviewRating(models.Model):
    user = models.ForeignKey(User,blank=True,on_delete=models.CASCADE)
    product=models.ForeignKey(Product,related_name="comments", on_delete=models.CASCADE)
    rating_1 = models.IntegerField(choices=RATING1,default=0)    
    def __str__(self):
        return '%s - %s - %s'%(self.user, self.product, self.date_added)

Виды

from django.db.models import Avg
 
def Notes (request, product_id):
    product = Product.objects.get(pk=product_id)
    data = Product.objects.order_by('name').annotate(
        avg_rating_1 =Avg('champcomments__rating_1 '),

    return render(request, 'main/notes.html',{'product':product, 'data':data})

Шаблон

{% for ReviewRatingin champagnes %}

{{ReviewRating.avg_rating_1 }}

{% endfor %}

Здравствуйте, чтобы использовать этот метод в качестве поля в проекте, необходимо использовать агрегацию и декоратор @property. Вот пример вашего кода.

class Product(models.Model):
    name = models.CharField('Product Name', max_length=120, null=True)

    class Meta:
        db_table='Product'

    def __str__(self):
        return str(self.name)
    
    @property
    def rating(self):
        rating = self.comments.aggregate(Avg('rating_1'))['rating_1__avg']

А внутри вашего шаблона вы можете использовать это следующим образом:

{% for ReviewRating in champagnes %}

{{ReviewRating.rating_1 }}

{% endfor %}

Не забудьте импортировать Avg from django.db.models import Avg

Решено.

Все, что мне было нужно, это изменить представления с "order_by" на "filter(pk=product_id)".

Я знал, что это просто! (спасибо тем, кто пытался помочь)

from django.db.models import Avg
 
def Notes (request, product_id):
    product = Product.objects.get(pk=product_id)
    data = Product.objects.filter(pk=product_id).annotate(
        avg_rating_1 =Avg('comments__rating_1 '),

    return render(request, 'main/notes.html',{'product':product, 'data':data})
Вернуться на верх