我尝试使用下面的方法保存项目的审阅者,并且选择字段显示正确:
# Query the user with Role.id == 4 as reviewer def reviewer_choices(): return User.query.join(User.roles).filter(Role.id == 4) # Build a select field class ProjectView(sqla.ModelView): form_extra_fields = { 'reviewer': sqla.fields.QuerySelectField( label='Reviewer', query_factory=reviewer_choices, )}
但是,当我尝试保存它时,出现了错误:
InterfaceError: (sqlite3.InterfaceError) Error binding parameter 8 - probably unsupported type. [SQL: u'INSERT INTO project(...reviewer...)VALUES(...<__main__.User object at 0x00000000048E89E8>...)。
InterfaceError: (sqlite3.InterfaceError) Error binding parameter 8 - probably unsupported type. [SQL: u'INSERT INTO project(...reviewer...)VALUES(...<__main__.User object at 0x00000000048E89E8>...)
我注意到审阅者是一个对象,类似于:<__main__.User object at 0x00000000048E89E8>。那么审阅者的正确数据类型是什么,以便我可以将其保存到数据库中?我目前使用:
<__main__.User object at 0x00000000048E89E8>
在项目类中
class Project(db.Model): # ... reviewer = db.Column(db.Unicode(128)) # ...
在项目表中
CREATE TABLE `project` ( # ... `reviewer1` TEXT, # ...
我也尝试定义 __repr__但__str__都不起作用:
__repr__
__str__
class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(255)) # ... # ... def __repr__(self): return self.first_name class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(255)) # ... # ... def __str__(self): return self.first_name
您遇到的问题是 QuerySelectField 返回的是一个 User 对象,而不是可以直接存储到数据库中的类型。要解决这个问题,您可以将 reviewer 字段定义为外键,存储审阅者的 id,而不是整个 User 对象。
QuerySelectField
User
reviewer
id
以下是具体步骤:
Project
Integer
这样可以避免将整个 User 对象存储在 reviewer 字段中,只保存审阅者的唯一标识符。
调整 QuerySelectField 的处理:
get_pk
from flask_admin.form.fields import QuerySelectField from sqlalchemy.orm import backref # Query the user with Role.id == 4 as reviewer def reviewer_choices(): return User.query.join(User.roles).filter(Role.id == 4) # 更新 Project 模型,使用外键存储 reviewer 的 id class Project(db.Model): # ... reviewer_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 定义为外键 reviewer = db.relationship('User', backref=backref('projects', lazy=True)) # 建立关系 # ... # 使用 Flask-Admin 中的 ModelView 定义表单字段 class ProjectView(sqla.ModelView): form_extra_fields = { 'reviewer': QuerySelectField( label='Reviewer', query_factory=reviewer_choices, get_label='first_name', # 使用 User 的 first_name 字段显示 allow_blank=True ) }
reviewer_id
db.ForeignKey
relationship
Project.reviewer
get_label
get_label='first_name'
first_name
project