You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:15:08