我的数据库times_seentimes_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)中没有错误,所有值都已四舍五入为整数,即10

在视图功能中,我将结果显示为:

<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()

09-27 23:34