我想列出一个灵巧对象的所有字段(和值)。
我可以轻松访问单个字段值,例如myobject.myfield
但我不知道如何列出对象的所有可用字段。
答案 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