Flask Admin结合SQLAlchemy:如何获取祖父表列实现列表筛选
Flask Admin 多级关联表字段展示与筛选实现
针对Task-Story-Project三级外键关联场景,要在Task管理页展示祖父表Project字段、实现对应筛选,按以下步骤配置即可:
1. 列表页跨级字段展示
Flask Admin列表渲染原生支持点语法访问关联层级属性,直接在column_list中添加跨级字段路径即可,同时可通过column_labels配置友好显示名:
class TaskModelView(ModelView): create_modal = False edit_modal = False can_set_page_size = True page_size = 20 column_display_pk = True column_display_all_relations = True # 声明列表展示列,点语法对应关联路径:Task.story -> Story.project -> Project.title column_list = ('task_id', 'description', 'story', 'story.project.title') # 列名映射 column_labels = { 'story': '所属需求', 'story.project.title': '所属项目' }
2. 跨级字段筛选配置
默认筛选转换器不支持解析多级点路径的查询条件,需要借助SQLAlchemy的has()方法构造嵌套关联查询条件,搭配Flask Admin自带的筛选类实现:
from flask_admin.contrib.sqla.filters import FilterLike, FilterEqual class TaskModelView(ModelView): # 省略上述基础配置、column_list、column_labels部分 column_filters = [ 'story.description', # 原有父表Story的筛选 # 新增祖父表Project名称的模糊匹配筛选 FilterLike( column=Task.story.has(Story.project.has(Project.title)), name='所属项目' ), # 若需要精确匹配筛选(如下拉选指定项目),追加以下配置即可 # FilterEqual( # column=Task.story.has(Story.project.has(Project.project_id)), # name='所属项目', # options=lambda: [(p.project_id, p.title) for p in Project.query.all()] # ) ]
配置完成后,列表页筛选栏就会出现「所属项目」的筛选输入框,可正常按项目名称过滤Task数据。
3. 创建/编辑表单下拉优化
如果需要创建Task时的Story下拉选项能直观显示所属项目,直接修改Story模型的字符串返回方法即可,不需要额外改表单配置:
class Story(db.Model): # 省略原有字段、关系配置 def __str__(self): # 下拉选项显示格式:[项目名] 需求描述 return f"[{self.project.title}] {self.description}"
如果需要实现「先选项目、再加载该项目下Story」的二级联动下拉,需要重写表单字段的ajax查询接口,简单业务场景下上述字符串格式化的方案足够使用。
注意:请确保三层模型的外键、relationship配置正确,
has()方法仅适用于一对多/多对一关系的EXISTS查询,和现有模型结构完全匹配,可直接使用。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

