列出灵巧对象的字段

时间:2012-08-29 13:06:01

标签: plone dexterity

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

我可以轻松访问单个字段值,例如myobject.myfield

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

5 个答案:

答案 0 :(得分:9)

Dexterity对象由一个可枚举的模式定义:

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,但如果你的模式上没有任何方法,你也可以使用接口作为迭代器:

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

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

from zope.schema import getFieldsInOrder

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

如果您通过网络定义了架构,则可能不知道如何查找类型的界面。您还可以通过工厂类型信息或简称FTI检索模式接口:

from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility

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

其中schema现在保存您的界面。

答案 1 :(得分:6)

大卫指出,我找不到一种方法来枚举来自行为的字段。

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

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):
      # ...

答案 2 :(得分:4)

我找到了办法。 由于灵巧方案的不同,我无法直接使用Christophs的建议。 但这现在有效

for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
    value = getattr(getattr(obj, key), 'output', getattr(obj, key))

答案 3 :(得分:1)

您也可以使用FTI:

from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility

fti = getUtility(IDexterityFTI, name='rgd.venues.venue')
schema = fti.lookupSchema()
fields = getFieldsInOrder(schema)
for key, value in fields:
    # so something

答案 4 :(得分:1)

弄清楚如何列出字段和行为中的所有字段:

from plone.behavior.interfaces import IBehavior
from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility


def get_fields(portal_type):
    fti = getUtility(IDexterityFTI, name=portal_type)
    schema = fti.lookupSchema()
    fields = schema.names()
    for bname in fti.behaviors:
        factory = getUtility(IBehavior, bname)
        behavior = factory.interface
        fields += behavior.names()
    return fields