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

Django PostgreSQL ArrayField序列化报错:invalid literal for int() with base 10

解决PostgreSQL ArrayField接收POST数组时的类型转换错误

这个问题我之前也碰到过,本质是前端传递的数组格式不对,或者序列化器没有正确配置来处理数组类型,导致Django把整个数组字符串当成单个整数来解析,自然就抛出invalid literal for int() with base 10: '[176,68]'的错误了。下面给你一步步解决的方案:

1. 修正序列化器字段配置

首先要确保你的DRF序列化器正确对应模型的ArrayField——不能直接用IntegerField,而是要用ListField包裹IntegerField来处理数组类型。示例代码如下:

from rest_framework import serializers
from .models import YourModel  # 替换成你的模型类

class YourModelSerializer(serializers.ModelSerializer):
    # 用ListField处理数组,子字段指定为IntegerField
    price = serializers.ListField(child=serializers.IntegerField())

    class Meta:
        model = YourModel
        fields = ['price', ]  # 加上你需要的其他字段

2. 确保前端发送正确格式的请求

这是最容易踩坑的点,分两种场景:

场景一:发送JSON格式请求

如果是前后端分离的项目,前端必须设置请求头Content-Type: application/json,并且请求体是标准JSON格式:

{
    "price": [176, 68]
}

这样DRF的序列化器会自动解析成整数列表,匹配模型的ArrayField。

场景二:表单提交请求

如果是传统HTML表单提交,不能直接写price=[176,68](这会把整个字符串作为值传递),而是要把数组拆成多个同名字段:

<input type="number" name="price" value="176">
<input type="number" name="price" value="68">

提交后Django会自动把多个price参数拼接成列表,序列化器的ListField也能正确解析。

3. 手动处理请求数据的兜底方案

如果你是手动处理请求(而非用序列化器自动解析),比如直接从request.POST取数据,需要手动把字符串格式的数组解析成列表:

import json

# 从POST中获取字符串格式的数组
price_str = request.POST.get('price')
try:
    # 解析成整数列表
    price_list = json.loads(price_str)
    # 验证每个元素都是整数
    price_list = [int(item) for item in price_list]
except (json.JSONDecodeError, ValueError):
    # 处理解析失败的情况
    pass

不过这种方式不如用序列化器自动处理可靠,优先推荐前面两种方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:38:10