如何在Flask-Admin的ModelView中展示关联表的指定字段
实现方案
有成熟可行的实现方式,不需要依赖inline_models属性,具体操作如下:
首先假设你的模型定义示例如下(方便对应配置):
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Order(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), nullable=False) # 其他订单字段省略 items = db.relationship('OrderItem', backref='order') class OrderItem(db.Model): id = db.Column(db.Integer, primary_key=True) order_id = db.Column(db.Integer, db.ForeignKey('order.id'), nullable=False) product_name = db.Column(db.String(100), nullable=False) # 其他订单项字段省略
方案1:直接引用关联字段(最简单)
Flask-Admin原生支持SQLAlchemy的关联属性语法,直接在视图配置中指定父表字段即可:
from flask_admin.contrib.sqla import ModelView class OrderItemView(ModelView): # 列表页展示字段,通过关系名.字段名引用父表属性 column_list = ('id', 'product_name', 'order.email', 'order.id') # 给关联字段设置自定义显示名称 column_labels = { 'order.email': '下单邮箱', 'order.id': '关联订单号' } # 配置可排序字段,支持直接传入关联字段 column_sortable_list = ('product_name', 'order.email', 'order.id') # 配置可搜索字段,同样支持关联字段 column_searchable_list = ('product_name', 'order.email', 'order.id') # 配置表单排除关联字段的编辑权限,保证只读 form_excluded_columns = ['order']
方案2:自定义格式化列(适合多字段合并展示)
如果需要把多个父表字段合并到同一列展示,可以用自定义列格式化器实现:
class OrderItemView(ModelView): # 新增自定义列名order_info column_list = ('id', 'product_name', 'order_info') column_labels = { 'order_info': '订单关联信息' } # 自定义列内容格式化方法 def _order_info_formatter(view, context, model, name): if not model.order: return '-' return f'订单号:{model.order.id} / 下单邮箱:{model.order.email}' # 绑定格式化器到自定义列 column_formatters = { 'order_info': _order_info_formatter } # 给自定义列绑定排序依据的实体字段 column_sortable_list = { 'order_info': ('order.id', 'order.email') } # 配置搜索范围 column_searchable_list = ('order.id', 'order.email', 'product_name') form_excluded_columns = ['order']
两种方案都完全满足只读展示、排序、搜索的需求,直接将自定义的OrderItemView注册到Flask-Admin实例即可生效。
内容的提问来源于stack exchange,提问作者kontur
相关产品推荐
相关产品推荐

