比如有两个 SQLAlchemy 模型,Post 和 Tag,两者之间是 Many-to-Many 的关系,因为我想在渲染页面时传个 Pagination 对象过去方便分页,所以在定义关系时用了lazy='dynamic'
参数,返回的是一个BaseQuery
对象。
在使用Flask-Admin
时我想在Tag
的管理页面上每一条纪录都能出现一个Posts
的字段用来显示当前Tag
中Post
的数量,所以我们简单的这么表示:
class RBTagAdmin(ModelView):
column_list = ('topic', 'posts')
column_formatters = dict(posts=RBColumnFmtter.count_post)
但是在访问页面的时候会出这么一个错误InvalidRequestError: 'Tag.posts' does not support object population - eager loading cannot be applied.
。
这是为什么呢?因为Flask-Admin 默认认为模型使用的是 joined 方式,所以导致dynamic
方式的关系字段查询时出现错误(我猜的噜),所以我们在定义自己的ModelView
时需要改写这么一条类变量column_auto_select_related = False
,让RBTagAdmin
不自动处理外键的查询,而是让开发者自己后续处理,像下面这样:
class RBTagAdmin(ModelView):
column_auto_select_related = False column_list = ('topic', 'posts')
column_formatters = dict(posts=RBColumnFmtter.count_post)
之后就没问题了~