通过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
相关产品推荐
相关产品推荐

