如何通过Python向Metabase仪表盘添加卡片?
接口参数释义
id:目标新仪表盘的ID,对应接口路径中的:id占位符,需提前创建空白仪表盘后获取该值cardId:待复制的原有卡片的唯一ID,可从旧仪表盘的卡片列表中提取parameter_mappings:卡片与仪表盘全局筛选参数的映射关系,无关联筛选时直接传空数组[]即可,有筛选的场景直接复用旧卡片的对应映射配置就行series:多查询组合系列卡片的查询ID列表,普通单查询卡片直接传空数组[]即可dashboard-card:控制卡片在仪表盘上的排版配置,为字典结构,必填字段为size_x(卡片宽度)、size_y(卡片高度)、row(卡片所在行号,决定纵向排序)、col(卡片所在列号,决定横向排序),直接复用旧卡片的对应配置即可保留原有排版
Python实现代码
import requests # 基础配置替换为自己的实际信息 METABASE_HOST = "http://your-metabase-domain.com" ADMIN_ACCOUNT = "your-account@xxx.com" ADMIN_PASSWORD = "your-password" OLD_DASHBOARD_ID = 123 # 待复制的源仪表盘ID NEW_DASHBOARD_NAME = "复制后的新仪表盘" # 请求头统一配置 headers = {"Content-Type": "application/json"} # 1. 调用登录接口获取会话凭证 login_res = requests.post( f"{METABASE_HOST}/api/session", json={"username": ADMIN_ACCOUNT, "password": ADMIN_PASSWORD}, headers=headers ) session_id = login_res.json()["id"] headers["X-Metabase-Session"] = session_id # 2. 创建空白新仪表盘,获取新仪表盘ID new_dash_res = requests.post( f"{METABASE_HOST}/api/dashboard", json={"name": NEW_DASHBOARD_NAME}, headers=headers ) new_dash_id = new_dash_res.json()["id"] # 3. 拉取源仪表盘的所有有序卡片信息 old_dash_res = requests.get( f"{METABASE_HOST}/api/dashboard/{OLD_DASHBOARD_ID}", headers=headers ) ordered_cards = old_dash_res.json()["ordered_cards"] # 4. 遍历卡片依次添加到新仪表盘 for card_info in ordered_cards: add_card_payload = { "cardId": card_info["card_id"], "parameter_mappings": card_info["parameter_mappings"], "series": card_info.get("series", []), "dashboard-card": { "size_x": card_info["size_x"], "size_y": card_info["size_y"], "row": card_info["row"], "col": card_info["col"] } } requests.post( f"{METABASE_HOST}/api/dashboard/{new_dash_id}/cards", json=add_card_payload, headers=headers )
注意事项
- 如果不需要保留原仪表盘的排版,可自行修改
dashboard-card中的行、列、宽高参数 - 若源仪表盘配置了全局筛选参数,可额外调用仪表盘更新接口将筛选规则同步到新仪表盘
内容的提问来源于stack exchange,提问作者NicolasRx
相关产品推荐
相关产品推荐

