2012-04-13 93 views
3

我正在編寫一個用於保留不同資源的Plone日曆模塊。該模塊具有一個日曆,其事件存儲在Postgresql中。每個日曆都是存儲在ZODB中的敏捷對象。使用鍵入的uuids而不是字符串uuids查詢portal_catalog

爲了在Plone和Postgresql之間建立鏈接,我自然轉向了Plone對象的uuid屬性。因此,Plone中的每個uuid都充當Postgresql中的外鍵,它在本地支持uuid。

直到我開始使用Plone 4.1.4時,這在過去的6個月裏對我很好。有了它,引入了plone.uuid 1.0.2,它將uuids的字符串表示形式從uuids 更改爲uuids 而沒有破折號。

這個改變的問題是我不能再確定哪個表示將被用在任何給定的對象上。在Plone 4.1.4之前創建的對象包含與之後創建的對象不同的格式化uuid字符串。長話短說,爲了確保我的代碼能夠與任何uuid表示一起工作,我希望能夠使用Python的uuid類型進行搜索。

所以不是這樣:

catalog.searchResults(UID='325dc47e-08f9-4fa1-bc18-3944a725adb4') 

它返回不同結果比這

catalog.searchResults(UID='325dc47e08f94fa1bc183944a725adb4') 

我很樂意這樣做:

from uuid import UUID 
catalog.searchResults(UID=UUID('325dc47e-08f9-4fa1-bc18-3944a725adb4')) 

這將是相當於這樣:

catalog.searchResults(UID=UUID('325dc47e08f94fa1bc183944a725adb4')) 

有誰知道我能做到那樣的獨立性,從Plone中的uuid的代表性?

+0

嗯。你不能在其他地方檢查字符串的函數UUID,根據需要插入或刪除破折號,然後調用'uuid.UUID'? (令人驚訝Plone每次更新都會產生多少破壞......) – 2012-04-13 09:31:16

+0

uuid.UUID實際上允許帶有或不帶破折號的字符串。在我所能做到的任何地方,我都會通過確保我處理的字符串(主要用於JSON)始終具有可預測的格式來利用該功能。 問題是,我基本上必須用兩種表示來查詢目錄,以確保我得到對象。 – 2012-04-13 10:09:13

+0

解決方案會是你所假設的(U)UID是字符串ID幷包含任何種類的字符?你爲什麼要破解破折號? – 2012-04-13 10:48:17

回答

3

你將不得不查詢兩種格式;一旦分配了UID字段,它就不應該改變,真的。你的選擇是這樣的:

  1. 創建給出一個UID返回既虛和非虛版本的元組的方法,然後用它來查詢目錄:

    def queryUID(UID): 
        if '-' in UID: 
         return (UID.replace('-', ''), UID) 
        return (UID, '-'.join([ 
         UID[:8], UID[8:12], UID[12:16], UID[16:20], UID[20:]])) 
    

    有了這種方法查詢簡單地變爲:

    catalog.searchResults(UID=queryUID('325dc47e-08f9-4fa1-bc18-3944a725adb4')) 
    
  2. 讓你的數據庫使用虛線在Plone的UID有破折號,非虛線的版本較舊的Plone內容仍然具有無覆蓋UID版本破折號。換句話說,將UID視爲不透明的字符串。

    Plone中的UID在任何情況下都不會改變,所以當生成虛線版本時,您不必搜索非虛線版本。一旦UID被分配給一個對象,它永遠不會改變,永遠不會獲得破折號。

  3. 不建議迭代您的ZODB並用虛線替換所有沒有破折號的UID。這很可能會破壞UID鏈接到這些項目的任何其他內容。

+0

我會繼續選擇一項。我想我可以對索引進行額外的查找。謝謝! – 2012-04-13 16:59:51

+0

這不是對索引的額外查找;我們要求索引匹配兩個值而不是一個。這非常有效。 :-) – 2012-04-13 17:15:42

相關問題