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

通过API调用PATCH Directus的translations数组字段不生效问题

问题排查要点

1. 优先替换手动拼接JSON的写法

你当前手动拼接JSON字符串的方式容错率极低,只要row里的内容包含双引号、特殊符号、转义字符,就会导致整个请求体结构破损,后端解析失败自然不会处理translations字段。直接用requests库自带的json参数自动序列化即可:

import requests
from requests.structures import CaseInsensitiveDict

headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
# 用json参数的话requests会自动设置Content-Type,也可以手动保留

for row in reader:
    # 直接用Python字典构造数据,自动处理转义
    payload = {
        "name": row[1],
        "alt_name": row[2],
        "translations": [
            {"id": "661", "name": row[1], "alt_name": row[2]},
            {"id": "662", "name": row[3], "alt_name": row[4]}
        ]
    }
    base_url = 'https://URL/path?&access_token=TOKEN'
    # 传json参数而不是data参数
    resp = requests.patch(base_url, headers=headers, json=payload)
    # 新增错误日志排查,确认返回结果
    print(resp.status_code, resp.json())

2. 确认后端API对嵌套数组的更新规则

大部分REST框架对PATCH请求的嵌套数组更新有特殊限制,常见要求如下:

  • 要求传全量translations数组:如果当前条目下除了id=661、662之外还有其他翻译条目,你只传两个的话后端可能会判定为非法修改,直接忽略该字段更新,需要把所有已存在的翻译条目都带上再提交
  • 要求明确指定操作类型:部分框架需要在数组元素中增加操作标识,比如{"id": "661", "name": row[1], "alt_name": row[2], "_operation": "update"},告知后端该条目为更新操作,否则默认忽略
  • 字段层级不匹配:确认后端接口文档中translations是否为根级字段,部分接口要求嵌套在attributes等父字段下才能识别

3. 排查请求响应内容

新增日志打印实际请求体和接口返回值:

  • 打印resp.request.body确认发送的translations结构是否符合预期
  • 打印resp.json()查看接口是否返回了translations字段相关的报错提示,大部分情况下后端会返回格式错误、权限不足之类的明确说明

内容的提问来源于stack exchange,提问作者Aleks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:57:01