我在Django choices字段有点麻烦。我已经编写了代码来计算每个StudySpace模型的最后5个结果的平均评分,并将这些评分存储为字符串,即“Busy”、“挺忙”等
我能做到这一点没问题。但是,我希望能够对索引页中的studyspace进行排序,但是要根据它们的平均评分(如旧的整数值)。在
我试过了
study_space_list = StudySpace.objects.order_by('avg_rating')
但是当我这样做时,记录是按字母顺序shown here排序的,而理想情况下,我希望使用choices元组中相应的数值对它们进行排序。i、 忙:1,空:5。在
评级模型以及相应的选择如下所示
^{pr2}$我希望通过studyspace的平均分数排序的简化视图如下所示
def index(request):
study_space_list = StudySpace.objects.order_by(<<<NO CLUE WHAT TO DO HERE>>>)
context = {'study_space_list': study_space_list}
return render(request, 'spacefinder/index.html', context)
平均评分由StudySpace在每次更新时计算
class StudySpace(models.Model):
department = models.ForeignKey(Department, on_delete=models.CASCADE)
space_name = models.CharField(max_length=200, unique=True)
avg_rating = models.CharField(default='Average', max_length=20)
def save(self, *args, **kwargs):
"""Recalculates avg_rating on save"""
query_set = Rating.objects.filter(studyspace=self.id).order_by('-id')[:10]
if query_set.exists():
average = query_set.aggregate(Avg('rating')).get('rating__avg')
self.avg_rating = get_busyness_score(average)
super(StudySpace, self).save(*args, **kwargs)
def get_busyness_score(value):
return Rating.rating_choices[round(value)-1][1]
您不应该依赖于更改数据库数据来适应您希望在模板中显示的方式。如果对包含整数字符串的
CharField
进行排序,它只会按字典顺序排序,这不是您想要的,就像21
比3
小,因为通过比较第一个数字,3
更大。在解决方案不是那么难,只需将
avg_rating
改为IntegerField
或更好,DecimalField
,专门处理人类可读数字。如果你想在模板中添加一些花哨的东西,你可以写一个自定义的模板标签来在数字周围显示额外的东西。在阅读关于what is Decimal的python文档,以及关于如何创建custom template tag的django文档。在
相关问题 更多 >
编程相关推荐