比如有两个 SQLAlchemy 模型,Post 和 Tag,两者之间是 Many-to-Many 的关系,因为我想在渲染页面时传个 Pagination 对象过去方便分页,所以在定义关系时用了lazy='dynamic'参数,返回的是一个BaseQuery对象。

在使用Flask-Admin时我想在Tag的管理页面上每一条纪录都能出现一个Posts的字段用来显示当前TagPost的数量,所以我们简单的这么表示:

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)

之后就没问题了~