Django中APIView操作ArrayField如何避免列表嵌套存储
问题原因
你代码里有两个关键问题导致存储的列表变成嵌套结构:
- 使用
append()方法会把整个列表当成单个元素塞进目标列表,自然形成嵌套结构。 - 视图里的
my_method写法不符合Django REST Framework规范,且获取验证数据的方式错误。
解决方案
修改视图逻辑,用extend()替换append()来合并列表,同时遵循DRF规范重写perform_create方法:
from rest_framework.generics import CreateAPIView from .models import MyModel from .serializers import MySerializer class MyApiView(CreateAPIView): serializer_class = MySerializer def perform_create(self, serializer): # 获取验证后的合法数据 validated_data = serializer.validated_data field_1 = validated_data.get('field_1', []) field_2 = validated_data.get('field_2', []) # 将两个一维列表合并为一个 combined_list = field_1 + field_2 # 直接传入合并后的数据保存,仅需一次数据库操作 serializer.save(field_1=combined_list, field_2=field_2) # 若必须先保存再修改(不推荐,多一次数据库写入),可使用以下写法: # obj = serializer.save() # obj.field_1.clear() # 清空原有数据 # obj.field_1.extend(field_1) # obj.field_1.extend(field_2) # obj.save()
补充说明
append()用于添加单个元素,extend()则是将另一个列表的元素逐个添加到目标列表中,这是两者的核心区别。- 优先选择在保存前处理好数据再传入
serializer.save(),比先保存后修改的效率更高。 - DRF默认会将请求中的JSON数组解析为Python一维列表,只要请求体里的
field_1是一维数组,validated_data中拿到的就是正常的一维列表。
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

