@@ -259,14 +259,37 @@ class FolderTreeSerializer(serializers.Serializer):
259259 workspace_id = serializers .CharField (required = True , allow_null = True , allow_blank = True , label = _ ('workspace id' ))
260260 source = serializers .CharField (required = True , label = _ ('source' ))
261261
262+ @staticmethod
263+ def _check_tree_integrity (queryset ):
264+ """检查树结构完整性"""
265+ for folder in queryset :
266+ if folder .lft >= folder .rght :
267+ return True # 需要重建
268+ if folder .is_leaf_node () and folder .get_children ().exists ():
269+ return True # 需要重建
270+ return False
271+
262272 def get_folder_tree (self , name = None ):
263273 self .is_valid (raise_exception = True )
264274 Folder = get_folder_type (self .data .get ('source' )) # noqa
275+
276+ # 检查特定工作空间的树结构完整性
277+ workspace_folders = Folder .objects .filter (workspace_id = self .data .get ('workspace_id' ))
278+
279+ # 如果发现数据不一致,重建整个表(这是 MPTT 的限制)
280+ if self ._check_tree_integrity (workspace_folders ):
281+ Folder .objects .rebuild ()
282+
265283 if name is not None :
266- nodes = Folder .objects .filter (Q (workspace_id = self .data .get ('workspace_id' )) &
267- Q (name__contains = name )).get_cached_trees ()
284+ nodes = Folder .objects .filter (
285+ Q (workspace_id = self .data .get ('workspace_id' )) &
286+ Q (name__contains = name )
287+ ).get_cached_trees ()
268288 else :
269- nodes = Folder .objects .filter (Q (workspace_id = self .data .get ('workspace_id' ))).get_cached_trees ()
289+ nodes = Folder .objects .filter (
290+ Q (workspace_id = self .data .get ('workspace_id' ))
291+ ).get_cached_trees ()
292+
270293 TreeSerializer = get_folder_tree_serializer (self .data .get ('source' )) # noqa
271294 serializer = TreeSerializer (nodes , many = True )
272295 return serializer .data # 这是可序列化的字典
0 commit comments