Spezifischere SQL-Abfrage mit flask-wtf queryselectfield

Ich möchte ein Login-Formular mit Flask und WTF erstellen. Die Anwendung sollte die Spitznamen aller Benutzer aus einer Datenbank-Tabelle lesen und in einem QuerySelectField anzeigen.

Es funktioniert – aber ich denke, dass ich es in einer "schöneren Weise" machen kann …

Ich habe eine Datenbank-Tabelle wie folgt:

id | nickname | fullname | email ----+-----------+----------------+-------------------------- 1 | Admin | The Admin | admin@example.com 2 | JDoe | John Doe | jd@example.com 

In meinen models.py habe ich die entsprechende Klasse User und eine Funktion 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 

Die form.py enthält die formklasse

 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') 

Wie ich schon sagte, alle Spitznamen erscheinen schön in meinem QuerySelectField.

 <select id="user" name="user"><option value="1">Admin</option><option value="2">JDoe</option></select> 

Aber ich wundere mich über die Abfrage, die gemacht wird:

 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" 

Es scheint, dass ganze Tabelle zurückgegeben wird und ich bekomme unnötige Daten (fullname und email) auch. Das will ich vermeiden

Wie kann ich nur User.id und User.nickname abfragen und in QuerySelectField anzeigen? (Natürlich habe ich Forschung – ich versuchte filter_by oder User.query (User.id, User.nickname) – aber nur Fehler über nicht übereinstimmende Tupel)

Kann jemand helfen?

Danke im Voraus!

Mycket

One Solution collect form web for “Spezifischere SQL-Abfrage mit flask-wtf queryselectfield”

Nicht sicher, welche Version von SQLAlchemy Sie verwenden, aber ab 0.9.0 gibt es sqlalchemy.orm.load_only, die verwendet werden können, um einfach eine Teilmenge von Spalten für eine Abfrage zurückzugeben.

Sie können getUser() wie folgt ändern:

 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') 
  • Fügen Sie Eingabefelder dynamisch mit wtforms hinzu
  • WTForms: IntegerField überspringt Zwang, wenn der String-Wert '0' ist
  • Wie kann ich mein ausgewähltes Feld mit WTForms machen?
  • Mit Flask-WTForms, wie gebe ich meinen Formularabschnitt des html?
  • Wie speichern Sie die request.form auf db durch wtforms oder Fehler in sqlalchemy Update?
  • WTForms-Fehler: TypeError: formdata sollte ein Multidict-Typ-Wrapper sein
  • Flask-WTForms: Wie kann man überprüfen, ob ein Feld benötigt wird?
  • Vor dem Befüllen eines WTforms in den Kolben, mit Daten aus einem SQLAlchemy-Objekt
  • Ein gültiges Formular löschen, nachdem es übermittelt wurde
  • Bestimmen Sie, welche WTForms-Taste in einer Flaschenansicht gedrückt wurde
  • Wtforms Formklasse Unterklassen und Feldbestellung
  • Python ist die beste Programmiersprache der Welt.