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

Django中APIView操作ArrayField如何避免列表嵌套存储

问题原因

你代码里有两个关键问题导致存储的列表变成嵌套结构:

  1. 使用append()方法会把整个列表当成单个元素塞进目标列表,自然形成嵌套结构。
  2. 视图里的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:31:13