Выставление среднего рейтинга для одного продукта - возможно, это простое решение, но не могу найти проблему
Я пытаюсь отобразить средний рейтинг для данного отдельного продукта из всех оценок, сделанных пользователями для этого отдельного продукта.
Что мне и удалось сделать. Однако мой код, похоже, отображает все продукты и связанные с ними отзывы, а не только конкретный продукт.
Очевидно, что я где-то указываю коду, чтобы он отображал все продукты вместо одного. Но я не очень уверен, где именно. Я думаю, что это происходит из кода в моем views.py.
Нужно также уточнить, на той же странице я пытаюсь отобразить:
- Средний отзыв на продукт (это то, над чем я работаю)
 - Все отзывы от разных пользователей о конкретном продукте (это работает)
 
Именно 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})