8

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

我可以像这样轻松访问单个字段值myobject.myfield

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

4

6 回答 6

9

敏捷对象由可枚举的模式定义:

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保存您的界面。

于 2012-08-29T13:09:18.833 回答
7

正如大卫所说,我找不到一种方法来枚举来自行为的字段。

因此,深入研究 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):
      # ...
于 2012-09-26T11:22:32.170 回答
5

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

for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
    value = getattr(getattr(obj, key), 'output', getattr(obj, key))
于 2012-08-29T14:34:27.097 回答
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
于 2012-08-29T13:15:39.653 回答
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
于 2018-11-12T21:56:03.123 回答
0

您可以使用iterSchematagetFieldsInOrder

from plone.dexterity.utils import iterSchemata
from zope.schema import getFieldsInOrder

for schema in iterSchemata(obj):
    print(u'  %s' % schema)
    for field in getFieldsInOrder(schema):
        print(u'    %s\t%s' % field)

如果 obj 是 aDocument它输出

plone.dexterity.schema.generated.Plone_5_1643036771_2_583572_0_Document
plone.app.dexterity.behaviors.discussion.IAllowDiscussion
  allow_discussion    plone.app.dexterity.behaviors.discussion.IAllowDiscussion.allow_discussion
plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation
  exclude_from_nav    plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation.exclude_from_nav
plone.app.dexterity.behaviors.id.IShortName
  id  plone.app.dexterity.behaviors.id.IShortName.id
plone.app.dexterity.behaviors.metadata.IDublinCore
  title       plone.app.dexterity.behaviors.metadata.IBasic.title
  description plone.app.dexterity.behaviors.metadata.IBasic.description
  subjects    plone.app.dexterity.behaviors.metadata.ICategorization.subjects
  language    plone.app.dexterity.behaviors.metadata.ICategorization.language
  effective   plone.app.dexterity.behaviors.metadata.IPublication.effective
  expires     plone.app.dexterity.behaviors.metadata.IPublication.expires
  creators    plone.app.dexterity.behaviors.metadata.IOwnership.creators
  contributors        plone.app.dexterity.behaviors.metadata.IOwnership.contributors
  rights      plone.app.dexterity.behaviors.metadata.IOwnership.rights
plone.app.contenttypes.behaviors.richtext.IRichTextBehavior
  text        plone.app.contenttypes.behaviors.richtext.IRichTextBehavior.text
plone.app.relationfield.behavior.IRelatedItems
  relatedItems        plone.app.relationfield.behavior.IRelatedItems.relatedItems
plone.app.versioningbehavior.behaviors.IVersionable
  changeNote  plone.app.versioningbehavior.behaviors.IVersionable.changeNote
  versioning_enabled  plone.app.versioningbehavior.behaviors.IVersionable.versioning_enabled
plone.app.contenttypes.behaviors.tableofcontents.ITableOfContents
  table_of_contents   plone.app.contenttypes.behaviors.tableofcontents.ITableOfContents.table_of_contents
于 2022-01-24T16:58:44.787 回答