我的数据库times_seen
和times_answered_correctly
中有两个整数列。
现在,我想选择所有被查看超过100次的元素,并通过数学运算(times_answered_correctly / times_seen
)对它们进行排序。
我正在使用以下代码,该代码可以正常工作并且不会出现任何错误:
top_10_hardest = db_session.query(QuizItems).filter(QuizItems.times_seen >= 100).order_by(QuizItems.times_answered_correctly / QuizItems.times_seen).all()
我也尝试了
.order_by(asc(QuizItems.times_answered_correctly / QuizItems.times_seen))
和desc()
。结果发生变化,但是仍然是随机排序的。{% for i in top_10_hardest %}
<p> {{ i.times_answered_correctly/i.times_seen }} </p>
{% endfor %}
给出:
0.9858490566037735
0.8082788671023965
0.7952941176470588
0.9202127659574468
0.7591623036649214
0.9950980392156863
0.9907621247113164
0.9905660377358491
0.39420935412026725
0.9931506849315068
为什么不起作用?
最佳答案
问题是列是Integer
列,即使.order_by(asc(QuizItems.times_answered_correctly / QuizItems.times_seen)
中没有错误,所有值都已四舍五入为整数,即1
或0
在视图功能中,我将结果显示为:
<p> {{ i.times_answered_correctly/i.times_seen }} </p>
那是我第一次进行正确的数学运算,但是在对项目进行排序之前,请记住order函数不起作用,因为它将元素视为整数。
解:
我用
cast()
函数解决了这个问题。我在Integer
函数中将Float
元素强制转换为order_by()
:db_session.query(QuizItems).filter(QuizItems.times_seen >= 100).order_by(cast(QuizItems.times_answered_correctly, Float) / cast(QuizItems.times_seen, Float)).all()