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