From fd1350d30784dc7aa8fd1941201033240a1e52c0 Mon Sep 17 00:00:00 2001 From: panxinying Date: Tue, 8 Sep 2026 17:37:51 +0800 Subject: [PATCH] fix: perform JSON serialization in search document node --- .../search_document_node.py | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/apps/application/workflow/nodes/search_document_node/search_document_node.py b/apps/application/workflow/nodes/search_document_node/search_document_node.py index cd6280de78d..29f8f3b27c7 100644 --- a/apps/application/workflow/nodes/search_document_node/search_document_node.py +++ b/apps/application/workflow/nodes/search_document_node/search_document_node.py @@ -5,8 +5,6 @@ @desc: """ -from typing import List - import jieba from django.db.models import Q from django.db.models import QuerySet @@ -46,6 +44,32 @@ class SearchDocumentNodeSerializer(serializers.Serializer): search_condition_list = serializers.ListField(required=False, label=_("search condition list"), default=list) +def _to_jsonable(value): + """将 ORM values() 行中的非 JSON 可序列化类型转为可序列化值。""" + import datetime + import decimal + import uuid + + if isinstance(value, (datetime.datetime, datetime.date)): + return value.strftime("%Y-%m-%d %H:%M:%S") + if isinstance(value, decimal.Decimal): + return float(value) + if isinstance(value, uuid.UUID): + return str(value) + if isinstance(value, bytes): + return value.decode("utf-8", errors="ignore") + if isinstance(value, dict): + return {k: _to_jsonable(v) for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [_to_jsonable(v) for v in value] + return value + + +def _serialize_items(rows): + """把 ORM values() 列表转成干净的可 JSON 序列化列表。""" + return [_to_jsonable(row) for row in rows] + + def _handle_auto_tags(workflow_manage, document_id_list, question_reference): question = ( workflow_manage.get_reference_field(question_reference[0], question_reference[1:]) if question_reference else "" @@ -220,9 +244,9 @@ def execute(self): knowledge_items = list(QuerySet(Knowledge).filter(id__in=final_knowledge_ids).values()) self.write_context("document_list", final_document_ids) - self.write_context("document_items", document_items) + self.write_context("document_items", _serialize_items(document_items)) self.write_context("knowledge_list", final_knowledge_ids) - self.write_context("knowledge_items", knowledge_items) + self.write_context("knowledge_items", _serialize_items(knowledge_items)) def get_details(self, index: int = 0, position: dict = None, old_details: dict = None, **kwargs): details = super().get_details(index, position, old_details, **kwargs)