【问题标题】:How to maintain average function in flask with SQLAlchemy?如何使用 SQLAlchemy 在烧瓶中保持平均功能?
【发布时间】:2020-10-08 14:44:21
【问题描述】:

假设我有一个表格评级,书籍和用户创建如下:

    CREATE TABLE books(
  id SERIAL PRIMARY KEY,
  ISBN VARCHAR NOT NULL,
  title VARCHAR NOT NULL,
  author VARCHAR NOT NULL,
  publicationYear INTEGER NOT NULL
);

    CREATE TABLE ratings(
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  book_id INTEGER REFERENCES books(id),
  rating INTEGER CHECK (rating <= 5)
);

CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  username VARCHAR UNIQUE,
  password VARCHAR NOT NULL,
);

我尝试创建一个网站,让我可以对某本书进行评分,而每次一些用户对这本书进行评分时,该网站应该保持其平均评分。 我的尝试:在 application.py 中的某些路线下: ....

rating = db.execute("SELECT AVG(rating) FROM ratings WHERE book_id = :id", {"id": book_id}).fetchone()
    if rating is None:
        rating = 0
....
return render_template("details.html", rating = rating, book = book)

内部细节.html:

(some html code)
Rating: {{ rating }} out of 5
(some other html code)

一切正常(没有任何错误),但有两个问题我无法解决:

1) 如果没有评分,我希望网站显示 0(评分),但它却显示为“(无,)”。

2) 如果有评分,而不是显示(例如)4.5 作为评分(我希望答案四舍五入到小数点后 1 位),而是显示“(Decimal('4.5000000000000000'),)”

如何解决这些问题以及为什么它检索非浮点数(我假设因为 rating 具有除整数以外的其他类型)?

备注:我不能使用任何东西,例如创建类/对象或特殊的 SQLAlchemy 属性 - 只能使用上述 SQL 查询。

【问题讨论】:

  • 你好远方,欢迎来到stackoverflow。您可以在返回渲染视图之前打印评级吗?这似乎与 SQLAlchemy 没有密切关系,我真的看不出那部分有什么错误。您可以检查 round(rating,1) 是否有效

标签: python html sql flask sqlalchemy


【解决方案1】:

您可以尝试一些可能的解决方法来解决您的问题:

如果没有评级,我怀疑 sqlalchemy 不会返回任何行,但它不是“无”,而是一个空数组 [],或者是行数为 0 的 sql 结果

试试这个检查:

if not rating:
  rating = 0

for item in rating:
  if item is None:
     rating = 0

Python 对 falsy 做了很多检查(零、空数组、None 等),但是如果你特别说“is None”,那么你只是在检查 None。执行后打印评级以检查那里到底发生了什么。

同样,如果您确实获得了评分,您应该将其打印出来并查看数字的样子。它可能很容易修复,所以试试round(number,1),它会删除除 1 之外的所有小数。

确保您使用的 IDE 允许您在代码发生时设置断点并检查代码。从长远来看,将所有内容都打印出来是不可行的。

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 2016-04-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多