编程语言
首页 > 编程语言> > python-使用键入的uuid而不是字符串uuid来查询portal_catalog

python-使用键入的uuid而不是字符串uuid来查询portal_catalog

作者:互联网

我正在编写用于保留其他资源的Plone日历模块.该模块具有一个日历,其事件存储在Postgresql中.每个日历都是存储在ZODB中的敏捷对象.

为了在Plone和Postgresql之间建立链接,我自然地转向了Plone对象的uuid属性.因此,Plone中的每个uuid都在Postgresql中充当外键,而本地支持uuid.

在我开始使用Plone 4.1.4之前的6个月中,这对我来说效果很好.借助它,引入了plone.uuid 1.0.2,它将uuid的字符串表示形式从带有uuid的uuid更改为没有破折号的uuid.

更改的问题在于,我无法再确定将在任何给定对象上使用哪种表示形式.在Plone 4.1.4之前创建的对象所包含的uuid-string格式与在之后创建的对象不同.

长话短说,为了确保我的代码可以与任何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的表示实现这种独立性?

解决方法:

您将不得不查询两种格式;实际上,一旦分配了UID字段,就不应对其进行更改.因此,您的选择是:

>创建一个给定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'))

>使数据库使用虚线版本,其中Plone UID带有破折号;非虚线版本,较旧的Plone内容仍具有不带破折号的UID.换句话说,将UID视为不透明字符串.

在任何情况下,Plone中的UID都不会更改,因此在生成虚线版本时,您不必搜索非虚线版本.将UID分配给对象后,它永远不会更改,也永远不会获得破折号.
>不建议您遍历您的ZODB,并用等效的虚线替换所有不带破折号的UID.这很可能会破坏通过UID链接到这些项目的其他任何内容.

标签:uuid,python,plone
来源: https://codeday.me/bug/20191201/2081101.html