我想列出一个dexterity对象的所有字段(和值)。
我可以很容易地访问单个字段值,如下面的myobject.myfield
但是我不知道如何列出一个对象的所有可用字段。
发布于 2012-08-29 21:09:19
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)如果您通过web定义了模式,您可能不知道如何查找您的类型的接口。您还可以通过Factory Type Information (简称FTI )检索模式接口:
from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility
schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema()其中schema现在保存您的接口。
发布于 2012-09-26 19:22:32
正如David指出的,我找不到一种方法来枚举来自behaviors的字段。
所以,深入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-08-29 22:34:27
我找到了一种方法。由于灵活的方案各不相同,我不能直接使用Christophs的建议。但是现在这个方法起作用了
for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
value = getattr(getattr(obj, key), 'output', getattr(obj, key))https://stackoverflow.com/questions/12178669
复制相似问题