2011-08-18 63 views
2

假設:有沒有辦法做一個portal_catalog保持層次結構?

Folder 
    - Document 
    - Document 
    - Folder1 
    - Document 
    - Document 

如果我使用的文件夾路徑portal_catalog,我得到:

[<Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71234>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71324>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd712fc>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71194>] 

但我想有一個保持層次背景下,像portal_catalog:

{ 
    "Folder": 
      [ 
      <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, 
<Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, 
       { 
       "Folder1":[ 
          <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c> 
         ] 
       } 
      ] 
} 

所以,如果它是一種夾子類型,它的id是一個字典的關鍵。

是可能有一個類似的數據strcuture(保持對象的層次結構),或者我將不得不創建我自己的遞歸函數(我知道上面的結構可能不存在,但我認爲你可以明白了)?由於性能問題,我正考慮使用portal_catalog和大腦。

謝謝!

+1

首先,你應該小心這一點。這很可能是你試圖解決錯誤的問題或試圖以錯誤的方式解決一個好問題。隨意多說一些你爲什麼這樣做,並可能有更好的答案。 –

+0

我正在複製一個對象結構從一個上下文到另一個上下文,但只有一些內容類型。第二個上下文不會有相同類型的對象,它會有其他的但具有相同的ID和標題。 –

+0

但你爲什麼要這麼做?這需要更多的上下文。 –

回答

4

我想你可以sort_onpath索引。這意味着您的目錄查詢結果將按層次結構進行排序。然後,您可以遞歸的方式使用itertools.groupby來獲取您描述的結構的迭代器。棘手的部分將是遞歸。你會想爲groupby使用一個key func,爲當前文件夾深度/遞歸級別選擇brain.getPath()的適當部分。

+2

恐怕你無法對ExtendedPathIndex進行排序,你必須手動進行排序或使用一個單獨的sortable_path索引,這是一個FieldIndex。 –

+0

嗯,我知道我曾經這樣做過,但也許那是之前 –

+0

不久前,我必須使用ExtendedPathIndex來處理這個完全相同的用例。 –

相關問題