2012-04-13 54 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

相关问题