我想使用Flask和WTF创建一个登录表单。应用程序应从数据库表中读取所有用户的昵称,并将它们显示在QuerySelectField中。
它确实有用 - 但我认为我可以用更好的方式做到这一点' ...
我有一个这样的数据库表:
id | nickname | fullname | email
----+-----------+----------------+--------------------------
1 | Admin | The Admin | admin@example.com
2 | JDoe | John Doe | jd@example.com
在我的 models.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
forms.py 包含表单类
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, SelectField
from wtforms.validators import DataRequired, Required
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from .models import User, getUser
class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
user = QuerySelectField(u'User', query_factory=getUser, get_label='nickname')
正如我所说,所有昵称都出现在我的QuerySelectField中。
<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"
似乎整个表被退回,我也收到了不必要的数据(全名和电子邮件)。 这就是我想要避免的。
如何只查询User.id和User.nickname并在QuerySelectField中显示它? (当然我做了研究 - 我尝试过filter_by或User.query(User.id,User.nickname) - 但只得到关于不匹配元组的错误)
有人可以帮忙吗?
提前致谢!
mycket
答案 0 :(得分:1)
不确定您使用的是哪个版本的SQLAlchemy,但从0.9.0
开始,sqlalchemy.orm.load_only可用于轻松返回查询的列子集。
您可以将getUser()
修改为以下内容:
from functools import partial
from sqlalchemy import orm
def getUser(columns=None):
u = User.query
if columns:
u = u.options(orm.load_only(*columns))
return u
def getUserFactory(columns=None):
return partial(getUser, columns=columns)
# subsequently when defining LoginForm
user = QuerySelectField(u'User',
query_factory=getUserFactory(['id', 'nickname']),
get_label='nickname')