【问题标题】:More specific SQL query with flask-wtf queryselectfield使用 flask-wtf queryselectfield 进行更具体的 SQL 查询
【发布时间】:2014-10-08 10:43:30
【问题描述】:

我想使用 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

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案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')
    

    【讨论】:

    • 这就是我想要的!非常感谢!
    猜你喜欢
    • 2015-08-14
    • 2023-04-02
    • 1970-01-01
    • 2014-10-09
    • 2014-10-08
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多