ListView返回列表中每个项目的评级,取自ForeignKeys

时间:2017-08-23 19:29:28

标签: django django-models django-views

简而言之,我想使用<p:ajax event="keyup" update="your_target_component_id" />显示教师列表及其相应的评分。

目前,我有 ListView

models.py

在我的列表视图中,我将class Teacher(models.Model): user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher') availability = models.BooleanField(default=False) class Review(models.Model): teacher = models.ForeignKey(Teacher) student = models.OneToOneField(Student, on_delete=models.PROTECT, related_name='Student') star = models.IntegerField(default=5) body = models.TextField() 函数定义为:

get_queryset()

现在我有了可以在模板中使用的对象class IndexView(ListView): def get_queryset(self): """Return the last five published teachers.""" return Teacher.objects.all()[:5]

我知道如何使用以下方式获得个人评分的平均评分:

teacher_list

现在我只需要更改,以便我不指定Review.objects.filter(teacher_id=self.kwargs['pk']).aggregate(Avg('star')) 的值并将其包含在teacher_id查询集中。因此teacher_list中的每位教师都有teacher_list属性。

This Django tutorial建议我可以使用教师对象直接访问相关模型。因此,对于teacher.rating中的教师,我应该可以使用teacher_list查看所有评论。然后,我将简单地找到该值的平均值,并以某种方式显示它。

1 个答案:

答案 0 :(得分:1)

您可以向Teacher模型添加@property,该模型将保留平均评论明星:

class Teacher(models.Model):
    # ...

    @property
    def average_review_stars(self):
        return list(self.review_set.aggregate(Avg('Sum')).values())[0]
        # self.review_set holds the reviews of the current Teacher
        # and you just aggregate the average of review stars

        # You cast the whole result to a list,
        # because dict_values does not support indexing
        # and you want the first and only value from this aggregation

您可以查看the docs,了解我将整个内容投放到列表然后访问[0]的原因。

注意:其他方法是self.review_set.aggregate(Avg('Sum')).pop('stars__avg')

然后在您的模板中,您可以自由访问此属性:

<ul>
{% for teacher in teacher_list %}
    <li>Average rating: {{ teacher.average_review_stars }}</li>
{% endfor %}
</ul>