python - 从数据库中获取所有记录(Flask 和 SQLAlchemy)
问题描述
我用 Flask 写了一个简单的网站。我希望能够从我的 SQLite 数据库中获取所有“汽车”信息并将其显示在页面上。我为此定义了一条路线:
@cars.route('/cars/all', methods=['GET', 'POST'])
def displayAllCars():
car = Cars.query.all()
return render_template('cars/allcars.html', cars=car)
我还为此创建了模板(Jinja2):
{% extends "base.html" %}
{% for car in cars %}
<p>{{ car.fuel }}</p> <!-- testing; should loop the fuel types for all the cars in the database -->
{% endfor %}
编辑:这是 models.py 文件。
import jwt
from time import time
from app import db, login
from datetime import datetime
from flask import current_app
from flask_login import UserMixin
from flask_login import LoginManager # new code entry
from werkzeug.security import generate_password_hash, check_password_hash
# timestamp to be inherited by other class models
class TimestampMixin(object):
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, onupdate=datetime.utcnow)
#added_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@login.user_loader # new code entry
def load_user(id): # new code entry
return User.query.get(int(id)) # new code entry --- # slightly modified such that the user is loaded based on the id in the db
# user class
class User(db.Model, TimestampMixin, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False, unique=True)
email = db.Column(db.String(80), nullable=False, unique=True)
password_hash = db.Column(db.String(128))
first_name = db.Column(db.String(20), nullable=False)
last_name = db.Column(db.String(20), nullable=False)
admin = db.Column(db.Integer, nullable=False, default=0)
# print to console username created
def __repr__(self):
return f'<User {self.username}>'
# generate user password i.e. hashing
def set_password(self, password):
self.password_hash = generate_password_hash(password)
# check user password is correct
def check_password(self, password):
return check_password_hash(self.password_hash, password)
# for reseting a user password
def get_reset_password_token(self, expires_in=600):
return jwt.encode(
{'reset_password': self.id, 'exp': time() + expires_in},
current_app.config['SECRET_KEY'],
algorithm='HS256').decode('utf-8')
# verify token generated for resetting password
@staticmethod
def verify_reset_password_token(token):
try:
id = jwt.decode(token, current_app.config['SECRET_KEY'],
algorithms=['HS256'])['reset_password']
except:
return
return User.query.get(id)
# Cars class
#try removing TimestampMixin?
class Cars(db.Model):
id = db.Column(db.Integer, primary_key=True)
added_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
manufacturer = db.Column(db.String(30), nullable=False)
model = db.Column(db.String(50), nullable=False)
summary = db.Column(db.Text, nullable=False)
description = db.Column(db.Text, nullable=False)
year = db.Column(db.Float, default=1970, nullable=False)
mileage = db.Column(db.Float, default=1, nullable=False)
transmission = db.Column(db.String(10), default='manual', nullable=False)
fuel = db.Column(db.String(10), default='diesel', nullable=False)
engine_size = db.Column(db.Float, default=0.0, nullable=False)
seats = db.Column(db.Float, default=2, nullable=False)
doors = db.Column(db.Float, default=2, nullable=False)
colour = db.Column(db.String(20), default='white', nullable=False)
mot = db.Column(db.Boolean, default=False, nullable=False)
last_mot = db.Column(db.Text, default='01/01/1970', nullable=False)
has_warranty = db.Column(db.Boolean, default=False, nullable=False)
photo = db.Column(db.Text)
price = db.Column(db.Float, default=0.0, nullable=False)
def __repr__(self):
return f'<Cars {self.year, self.manufacturer, self.model, self.price}>'
# FAQ class
class FAQ(db.Model):
id = db.Column(db.Integer, primary_key=True)
question = db.Column(db.Text, default='question', nullable=False)
answer = db.Column(db.Text, default='answer', nullable=False)
def __repr__(self):
return f'<FAQ {self.question}>'
Cars
已在模型文件中定义,但我无法从数据库中获取信息。我认为问题cars = Cars.query.all()
出在路线上,但我不确定。
我对 Python 还是很陌生,所以任何帮助都将不胜感激。
解决方案
你可以使用我认为的过滤器
cars = Cars.filter.all()
推荐阅读
- linux - 如何运行心跳功能
- java - 此 PDF 的幻数之前的字节顺序标记是什么?
- android - 如何在我的 Samsung A51 Android 10 的“内部存储”文件夹(主要外部存储)中创建文件?
- rust - 打印结构的值 - 出现错误,预期为 `,` 或 `}` 之一
- java - Gson 将 List 字段序列化为字符串并保留 SerializedName
- r - 总和(计数)错误:参数的“类型”(闭包)无效
- swift - 仅通过用户的 UID 访问用户信息
- java - 同步方法调用其他同步方法
- python - 使用带有插入符号的 rpy2 尝试分类而不是回归
- arrays - 将数组添加到 for 循环