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

DRF中如何结合Model与View正确使用serializers.ListField存储整数数组?

问题解决:让响应返回整数数组格式

问题原因

你当前用CharField存储整数数组,序列化时ListField会把存储的字符串按字符拆分(比如把"[2, 1]"拆成["[2", " 1]"]),导致返回格式不符合预期。以下是两种可行解决方案:


方案一:使用数据库原生数组/JSON字段(推荐)

直接用数据库支持的字段存储数组,避免字符串解析的问题:

针对PostgreSQL用户

修改models.py,使用PostgreSQL专属的ArrayField:

from django.db import models

class Schedule(models.Model):
    name = models.CharField(max_length=100)
    # 存储整数数组,默认空列表
    day_of_the_week = models.ArrayField(models.IntegerField(), default=list)

序列化器无需额外修改,DRF会自动处理序列化/反序列化,返回标准整数数组。

针对MySQL/SQLite等其他数据库

使用JSONField存储数组:

from django.db import models

class Schedule(models.Model):
    name = models.CharField(max_length=100)
    # 存储整数数组,默认空列表
    day_of_the_week = models.JSONField(default=list)

同样,序列化器无需修改,返回结果直接是整数数组。


方案二:自定义序列化字段(不修改模型)

如果暂时无法修改模型,可自定义字段处理字符串与整数数组的转换:

修改serializers.py:

from rest_framework import serializers
import ast

class IntegerListField(serializers.ListField):
    def to_internal_value(self, data):
        # 接收请求时,把整数数组转为字符串存储
        return str(data)
    
    def to_representation(self, value):
        # 返回响应时,把存储的字符串解析为整数数组
        try:
            # 解析字符串为列表,再转成整数
            return [int(item.strip()) for item in ast.literal_eval(value)]
        except (ValueError, SyntaxError):
            # 解析失败返回空列表
            return []

class ScheduleSerializer(serializers.ModelSerializer):
    day_of_the_week = IntegerListField()

    class Meta:
        model = Schedule
        fields = "__all__"

这样POST请求传入的整数数组会被转为字符串存储,GET请求时会自动解析回整数数组返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:00:54