【问题标题】:Django: filter a model with a field from another modelDjango:使用来自另一个模型的字段过滤模型
【发布时间】:2015-07-29 13:52:20
【问题描述】:

这是我的第一个 Django 应用程序。我正在尝试显示多条评论的平均评分。

这似乎适用于我的产品模板,但不适用于我的博客模板,因为未定义 productprofile_id:

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

如何在博客模型中使用related_products 字段过滤评论模型?或者是否可以只在我的帖子模板中包含产品视图?提前感谢您的帮助!

我的模型:

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%}

【问题讨论】:

  • 我找不到你的Review
  • 我不确定您希望帖子页面上的评级是什么。一个帖子可能与多个产品相关。您期望什么价值?
  • @DanielRoseman。我正在显示与每个帖子相关的产品列表。我也想显示产品的评分。

标签: python django


【解决方案1】:

我认为您应该在 ProductProfile 模型中使用评级方法,该方法返回该产品的平均评论:

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

现在您可以将其从两个视图中删除,并在您在帖子视图中迭代产品时调用 {{ product.avg_rating }}

【讨论】:

  • 太棒了!无法让您建议的标签工作,但这工作得很好:{% for value in related_product.avg_rating %} {{ value }} {%endfor%}
  • 如果您曾多次使用 avg_rating,我会查看 @cached_property 装饰器。 docs.djangoproject.com/en/1.8/ref/utils/…
【解决方案2】:

也许

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

{{ productprofile.review.rating }} 

{% endfor %}

?我不记得 .all 是否是必需的。

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2019-09-30
    • 2011-12-03
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多