2015-07-29 2 views
0

Это мое первое приложение Django. Я пытаюсь отобразить средний рейтинг из нескольких обзоров.Django: отфильтруйте модель с полем из другой модели

Это, кажется, работает в моем шаблоне продукта, но не на моем шаблоне блога, потому что productprofile_id не определен:

product_rating = Review.objects.filter(product_id=productprofile_id).aggregate(Avg('rating')).values() 

Как выбирать модель обзора с полем related_products в модели Блога? Или можно просто включить представление продукта в мой шаблон Post? Заранее спасибо за вашу помощь!

мои модели:

class Post(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=100) 
    related_product = models.ManyToManyField(ProductProfile, blank=True) 

    def __str__(self): 
     return self.title 

class ProductProfile(models.Model): 
    product = models.CharField(max_length=80) 
    avatar = models.ImageField(upload_to='profile_images', blank=True) 
    price = models.IntegerField() 
    info = models.TextField(blank=True) 
    category = models.ForeignKey(ProductCategories) 
    link = models.URLField(blank=True) 
    bookmarks = models.ManyToManyField(User, blank=True,related_name='product_bookmarks') 

    def __str__(self): 
     return self.product 

class Review(models.Model): 
    user = models.ForeignKey(User) 
    product = models.ForeignKey(ProductProfile) 
    rating = models.IntegerField() 
    review = models.TextField(blank=True) 

    def __str__(self): 
     return self.user.username 

Мои просмотров:

def post(request, post_id): 
    try: 
     post = Post.objects.get(pk=post_id) 
    except Post.DoesNotExist: 
     raise Http404 

    product_rating = Review.objects.filter(product_id=productprofile_id).aggregate(Avg('rating')).values() 

    return render(request, 'app/blog.html', {'post': post, 'product_rating': product_rating}) 

def product(request, productprofile_id): 
    try: 
     product = ProductProfile.objects.get(pk=productprofile_id) 
    except ProductProfile.DoesNotExist: 
     raise Http404 
    product_media = ProductMedia.objects.filter(product_id=productprofile_id) 
    product_brand = BrandProfile.objects.filter(products__id=productprofile_id) 
    review = Review.objects.filter(product_id=productprofile_id) 
    product_rating = Review.objects.filter(product_id=productprofile_id).aggregate(Avg('rating')).values() 

    return render(request, 'app/product.html', {'product': product, 'product_media': product_media, 'review': review, 'product_rating': product_rating, 'product_brand': product_brand,}) 

Мой шаблонный тег:

{% for value in product_rating %} {{ value }} {%endfor%} 
+0

Я не могу найти ваш 'Обзор'. – sobolevn

+0

Я не уверен, что вы хотите, чтобы рейтинг был на странице. Сообщение потенциально связано с несколькими Продуктами. Какую ценность вы ожидаете? –

+0

@ DanielRoseman. Я показываю список продуктов, связанных с каждым сообщением. Я также хотел бы показать рейтинг продукта. – Dakine

ответ

0

Я думаю, что вы должны сделать рейтинг метод на модели ProductProfile, которая возвращает среднее из обзоров для этого продукта:

class ProductProfile(models.Model): 
    ... 
    def avg_rating(self): 
     return self.review_set.aggregate(Avg('rating')).values() 

Теперь вы можете удалить его с обеих взглядов, и называют {{ product.avg_rating }}, когда вам итерации через продукты в представлении сообщения.

+0

Удивительный! Не удалось заставить ваш предложенный тег работать, но это работает отлично: '{% for value в related_product.avg_rating%} {{value}} {% endfor%}' – Dakine

+0

Я бы посмотрел на декоратор @cached_property, если вы когда-либо используете avg_rating более одного раза. https://docs.djangoproject.com/en/1.8/ref/utils/#django.utils.functional.cached_property –

0

Может

{% for productprofile in post.related_product_set.all %} 

{{ productprofile.review.rating }} 

{% endfor %} 

? Я не могу вспомнить, требуется ли .all.

Смежные вопросы