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

