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

