Flask-Admin 中的自定义和可排序列
Custom and sortable column in Flask-Admin
我正在使用 Flask-Admin 和 SQLAlchemy 并努力在列表视图中创建一个自定义的、可排序的字段。我是这样的用户和照片模型:
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
photos = db.relationship('Photo', backref='user', lazy='dynamic', cascade='all, delete-orphan')
class Photo(db.Model):
__tablename__ = 'photos'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), index=True)
filename = db.Column(db.String(128))
publish = db.Column(db.Boolean, index=True)
date = db.Column(db.DateTime, default=datetime.now)
然后我创建一个自定义视图 (UserView),创建一个名为 'test' 的自定义字段并使用 column_formatters 重写它以包含照片数。虽然结果正确,但该字段不可排序。还有其他方法可以解决这个问题吗?
class UserView(sqla.ModelView):
column_list = ('username', 'test')
def _count_formatter(view, context, model, name):
return model.photos.count()
column_formatters = {
'test': _count_formatter
}
def is_accessible(self):
return login.current_user.is_authenticated
您可以使用 SQLAlchemy 的 Hybrid Attributes,这对于定义作用于模型 class.
的高级函数很有用
修改后的模型:
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy import select, func
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
photos = db.relationship('Photo', backref='user', lazy='dynamic', cascade='all, delete-orphan')
@hybrid_property
def number_of_photos(self):
return self.photos.count()
@number_of_photos.expression
def number_of_photos(cls):
return select([func.count(Photo.id)]).where(Photo.user_id == cls.id).label('number_of_photos')
我们刚刚添加了新的混合属性。我们可以像 User
实例上的普通 table 列一样访问它:user.number_of_photos
.
和修改后的UserView
:
class UserView(sqla.ModelView):
column_list = ('username', 'number_of_photos')
column_sortable_list = ['username', 'number_of_photos']
def is_accessible(self):
return login.current_user.is_authenticated
这里我们必须明确定义 sortable/visible 列的列表。
我正在使用 Flask-Admin 和 SQLAlchemy 并努力在列表视图中创建一个自定义的、可排序的字段。我是这样的用户和照片模型:
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
photos = db.relationship('Photo', backref='user', lazy='dynamic', cascade='all, delete-orphan')
class Photo(db.Model):
__tablename__ = 'photos'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), index=True)
filename = db.Column(db.String(128))
publish = db.Column(db.Boolean, index=True)
date = db.Column(db.DateTime, default=datetime.now)
然后我创建一个自定义视图 (UserView),创建一个名为 'test' 的自定义字段并使用 column_formatters 重写它以包含照片数。虽然结果正确,但该字段不可排序。还有其他方法可以解决这个问题吗?
class UserView(sqla.ModelView):
column_list = ('username', 'test')
def _count_formatter(view, context, model, name):
return model.photos.count()
column_formatters = {
'test': _count_formatter
}
def is_accessible(self):
return login.current_user.is_authenticated
您可以使用 SQLAlchemy 的 Hybrid Attributes,这对于定义作用于模型 class.
的高级函数很有用修改后的模型:
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy import select, func
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
photos = db.relationship('Photo', backref='user', lazy='dynamic', cascade='all, delete-orphan')
@hybrid_property
def number_of_photos(self):
return self.photos.count()
@number_of_photos.expression
def number_of_photos(cls):
return select([func.count(Photo.id)]).where(Photo.user_id == cls.id).label('number_of_photos')
我们刚刚添加了新的混合属性。我们可以像 User
实例上的普通 table 列一样访问它:user.number_of_photos
.
和修改后的UserView
:
class UserView(sqla.ModelView):
column_list = ('username', 'number_of_photos')
column_sortable_list = ['username', 'number_of_photos']
def is_accessible(self):
return login.current_user.is_authenticated
这里我们必须明确定义 sortable/visible 列的列表。