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

调用serializer.save()后Postgres ArrayField仍为空(Django)

解决Django中Postgres ArrayField保存后为空的问题

问题根源

你创建HistorySerializer(data=data)后,serializer已经对传入的data做了快照保存。后续修改原始data字典的sources和questions键,不会同步到serializer内部的数据源——因为这两个是直接替换整个列表对象,而serializer初始化时已经持有了原来的空列表引用。

而conversation['bot']能正常保存,是因为你修改的是嵌套字典的内部键值,serializer引用的是同一个字典对象,所以修改会生效。

解决方案

方案1:先修改数据,再初始化Serializer(推荐)

把数据修改逻辑移到Serializer初始化之前,让Serializer从一开始就拿到完整的正确数据:

def histories(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        result = some_python_dictionary
        
        # 先完成所有数据修改
        data['conversation']['bot'] = result['answer']
        data['sources'] = result['sources']
        data['questions'] = result['questions']
        
        # 再初始化Serializer并验证
        serializer = HistorySerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        # 补充验证失败的处理
        return JsonResponse(serializer.errors, status=400)

方案2:修改Serializer的validated_data(适合必须在验证后修改的场景)

如果需要在serializer.is_valid()之后修改数据,直接操作serializer.validated_data(验证后的数据源),再执行保存:

def histories(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = HistorySerializer(data=data)
        
        if serializer.is_valid():
            result = some_python_dictionary
            
            # 修改验证后的数据源
            serializer.validated_data['conversation']['bot'] = result['answer']
            serializer.validated_data['sources'] = result['sources']
            serializer.validated_data['questions'] = result['questions']
            
            # 保存并返回最新的实例数据
            instance = serializer.save()
            return JsonResponse(HistorySerializer(instance).data, status=201)
        
        return JsonResponse(serializer.errors, status=400)

额外检查点

  • 确保result['sources']和result['questions']是符合要求的字符串列表,且questions的长度不超过模型中定义的size=3,否则会触发验证失败。
  • 确认迁移已正确执行:运行python manage.py makemigrations和python manage.py migrate(runserver不会自动执行迁移,需手动确认)。

内容的提问来源于stack exchange,提问作者Francis Guevara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:00:29