微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django:在 ListView 中显示评分计数

如何解决Django:在 ListView 中显示评分计数

我刚开始学习 django,我正在尝试在 ListView 中显示具有评级数量的产品。但我无法生成预期的输出

models.py

skl_img = cv2.imread("sample_skeleton_image/579366_2_train2017_skel.png",0) 

obj_img = cv2.imread("/content/drive/Shareddrives/Wish 2021/Code/sample_skeleton_image/579366_2_train2017.jpg",cv2.IMREAD_COLOR)

c3_skel = np.zeros_like(obj_img)
c3_skel[:,:,0] = skl_img
c3_skel[:,1] = skl_img
c3_skel[:,2] = skl_img
plt.imshow(c3_skel)

views.py

final_img = cv2.add(obj_img,c3_skel)
plt.imshow(final_img)

模板

class Product(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=255,default=None)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    
    
class Productrating(models.Model):
    product = models.ForeignKey(Product,on_delete=models.CASCADE,related_name='product_rating')
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    stars = models.SmallIntegerField(validators=[MinValueValidator(1),MaxValueValidator(5)])

这会按预期显示名称和平均评分,但会在每个产品旁边放置一个包含所有产品的查询集,如下所示:

class ProductListView(LoginrequiredMixin,ListView):
    model = Product

    def get_queryset(self):
        return Product.objects.annotate(avg_rating=Avg('product_rating__stars')).order_by('-avg_rating')

    def get_context_data(self,**kwargs):
        data = super(ProductListView,self).get_context_data(**kwargs)
        data['product_rating_count'] = Product.objects.annotate(Count('product_rating'))
        return data

解决方法

在您的模板中,您可以执行此操作。

{% for product in products %}

{{ product.name }} {{ product.avg_rating }} 

Rating count: {{ product.product_rating.all.count }}

{% endfor %}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。