简而言之,我想使用<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
查看所有评论。然后,我将简单地找到该值的平均值,并以某种方式显示它。
答案 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>