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

Django中ArrayField(JSONField)存储Google Places API数据类型不匹配报错

解决Django中ArrayField(JSONField())存储Google Places地址组件的类型不匹配问题

我来帮你搞定这个类型错误的问题!你遇到的问题本质是数据库字段类型(jsonb[])和你传入的数据类型(text[])不兼容,下面给你拆解原因和解决办法:

问题根源

你的模型里定义的address_components是ArrayField(JSONField()),对应PostgreSQL的jsonb[]类型(JSON对象的数组)。但你用列表推导赋值时,Django错误地把你传入的字典数组识别成了文本数组,导致数据库抛出类型不匹配的报错。

解决办法

1. 最简单的直接赋值(推荐)

Google Places API返回的address_components本身就是一个字典列表,Django的ArrayField(JSONField())可以直接接收这种格式,不需要额外的列表推导:

# 直接赋值,or []是为了处理API返回None的情况
address_components = google_place_details.get("address_components") or []

2. 需要处理组件时,保持元素为字典类型

如果你需要对每个地址组件做字段筛选或修改,确保处理后的每个元素依然是字典(不要转成字符串),比如:

address_components = []
for component in google_place_details.get("address_components", []):
    # 只保留需要的字段,保持字典结构
    cleaned_component = {
        "long_name": component.get("long_name"),
        "short_name": component.get("short_name"),
        "types": component.get("types")
    }
    address_components.append(cleaned_component)

3. 检查模型定义的正确性

确认你导入了正确的PostgreSQL专属字段,模型定义应该是这样的:

from django.db import models
from django.contrib.postgres.fields import ArrayField, JSONField

class GooglePlace(models.Model):
    # 注意ArrayField的参数是JSONField,同时给ArrayField也加上null/blank属性
    address_components = ArrayField(
        JSONField(null=True, blank=True),
        null=True,
        blank=True
    )
    # 其他模型字段...

这样处理后,Django会自动把每个字典序列化为JSON对象,存入数据库的jsonb[]字段,就不会再出现类型不匹配的报错啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:05