Python 使用flask wtf queryselectfield进行更具体的SQL查询
我想使用Flask和WTF创建一个登录表单。应用程序应该从数据库表中读取所有用户的昵称,并将其显示在QuerySelectField中 它确实有效——但我认为我可以用一种“更好的方式” 我有这样一个数据库表:Python 使用flask wtf queryselectfield进行更具体的SQL查询,python,flask,flask-sqlalchemy,flask-wtforms,Python,Flask,Flask Sqlalchemy,Flask Wtforms,我想使用Flask和WTF创建一个登录表单。应用程序应该从数据库表中读取所有用户的昵称,并将其显示在QuerySelectField中 它确实有效——但我认为我可以用一种“更好的方式” 我有这样一个数据库表: id | nickname | fullname | email ----+-----------+----------------+-------------------------- 1 | Admin | The Admin |
id | nickname | fullname | email
----+-----------+----------------+--------------------------
1 | Admin | The Admin | admin@example.com
2 | JDoe | John Doe | jd@example.com
在mymodels.py中,我有相应的类User和函数getUser:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
fullname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
def __repr__(self):
return '<User %r>' % (self.nickname)
# used for query_factory
def getUser():
u = User.query
return u
正如我所说,所有昵称都很好地出现在我的QuerySelectField中
<select id="user" name="user"><option value="1">Admin</option><option value="2">JDoe</option></select>
看起来整个表都被返回了,我也收到了不必要的数据(全名和电子邮件)。
这就是我想要避免的
如何仅查询User.id和User.昵称并将其显示在QuerySelectField中?
(当然,我做了研究——我尝试了按或User.query(User.id,User.昵称)筛选,但只得到了关于不匹配元组的错误)
有人能帮忙吗
提前谢谢
mycket不确定您使用的是哪个版本的SQLAlchemy,但是从
0.9.0
开始,有一个版本可以用于轻松返回查询的列子集
您可以将getUser()
修改为如下内容:
从functools导入部分
从sqlalchemy导入orm
def getUser(列=无):
u=User.query
如果列:
u=u.选项(仅限格式加载(*列))
返回u
def getUserFactory(列=无):
返回部分(getUser,columns=columns)
#随后在定义LoginForm时
user=QuerySelectField(u'user',
query_factory=getUserFactory(['id','昵称]]),
获取_label='昵称')
这就是我要找的!谢谢!
<select id="user" name="user"><option value="1">Admin</option><option value="2">JDoe</option></select>
INFO sqlalchemy.engine.base.Engine SELECT "user".id AS user_id, "user".nickname AS user_nickname, "user".fullname AS user_fullname, "user".email AS user_email
FROM "user"