首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出dexterity对象的字段

列出dexterity对象的字段
EN

Stack Overflow用户
提问于 2012-08-29 21:06:01
回答 6查看 2.1K关注 0票数 8

我想列出一个dexterity对象的所有字段(和值)。

我可以很容易地访问单个字段值,如下面的myobject.myfield

但是我不知道如何列出一个对象的所有可用字段。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-29 21:09:19

Dexterity对象由模式定义,该模式是可枚举的:

代码语言:javascript
复制
from zope.interface.interfaces import IMethod

for name, desc in IYourDexteritySchema.namesAndDescriptions():
    value = getattr(yourDexterityInstance, name)
    if IMethod.providedBy(desc):
        # It's a method, call it
        value = value()

这里我使用了.namesAndDescriptions() method,但是如果您的模式上没有任何方法,您也可以将该接口用作迭代器:

代码语言:javascript
复制
for name in IYourDexteritySchema:
    value = getattr(yourDexterityInstance, name)

最后但并非最不重要的是,zope.schema有一个名为getFieldsInOrder的实用程序方法,它将过滤接口中的zope.schema字段;上面的方法还列出了方法和非模式属性,getFieldsInOrder只列出了zope.schema特定的属性类型:

代码语言:javascript
复制
from zope.schema import getFieldsInOrder

for name, field in getFieldsInOrder(IYourDexteritySchema):
    value = getattr(yourDexterityInstance, name)

如果您通过web定义了模式,您可能不知道如何查找您的类型的接口。您还可以通过Factory Type Information (简称FTI )检索模式接口:

代码语言:javascript
复制
from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility

schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema()

其中schema现在保存您的接口。

票数 9
EN

Stack Overflow用户

发布于 2012-09-26 19:22:32

正如David指出的,我找不到一种方法来枚举来自behaviors的字段。

所以,深入plone.dexterity,在utils.getAdditionalSchemata函数中,我发现这个方法可以大致解决这个问题:

代码语言:javascript
复制
from zope.schema import getFieldsInOrder
from plone.behavior.interfaces import IBehaviorAssignable

behavior_assignable = IBehaviorAssignable(context)
if behavior_assignable:
  behaviors = behavior_assignable.enumerateBehaviors()
  for behavior in behaviors:
    for k,v in getFieldsInOrder(behavior.interface):
      # ...
票数 7
EN

Stack Overflow用户

发布于 2012-08-29 22:34:27

我找到了一种方法。由于灵活的方案各不相同,我不能直接使用Christophs的建议。但是现在这个方法起作用了

代码语言:javascript
复制
for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
    value = getattr(getattr(obj, key), 'output', getattr(obj, key))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12178669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档