Django按整数值排序,而不是choices字段的字符串值

2024-10-04 07:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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]

Tags: selfbyobjects排序modelsorderspace评分
1条回答
网友
1楼 · 发布于 2024-10-04 07:31:00

您不应该依赖于更改数据库数据来适应您希望在模板中显示的方式。如果对包含整数字符串的CharField进行排序,它只会按字典顺序排序,这不是您想要的,就像213小,因为通过比较第一个数字,3更大。在

解决方案不是那么难,只需将avg_rating改为IntegerField或更好,DecimalField,专门处理人类可读数字。如果你想在模板中添加一些花哨的东西,你可以写一个自定义的模板标签来在数字周围显示额外的东西。在

阅读关于what is Decimal的python文档,以及关于如何创建custom template tag的django文档。在

相关问题 更多 >