0

我正在创建一个应用程序,我想拥有一组可扩展的属性(每个属性都是 RatingProperty) 我还想验证任何动态属性都属于 RatingProperty 类型。

在 Expando 文档中它说:

提示:如果要使用 Property 类验证动态属性值,可以实例化 Property 类并在值上调用其 validate() 方法。

所以如果我想验证一个动态属性,我需要知道类的非动态属性是什么。我怎样才能问我的班级它定义的属性是什么?

我考虑过创建一个类方法,该方法接受一个字符串,如果该字符串位于我创建和维护的属性名称列表中,则返回 true,但这似乎是一种 hack。我已经在 Google 上搜索了提示,但没有任何运气。

谢谢,帕特

4

4 回答 4

1

经过更多研究(该死的lazyweb!)我找到了一个我认为可以接受的解决方案:

动态属性不能是 db 子类属性类型。因此,必须采取两个不同的步骤。首先,您需要创建属性类的实例并验证您的值:

test = db.RatingProperty()
if test.validate(valueToSave):
    #do your thing

接下来您需要检查您要保存的属性是否是已声明的属性:

if valueToSaveKey not in myObject.properties():
    #if not save it as desired
    myObject.valueToSaveKey = valueToSave

这里的缺点是您保存的值没有存储为您想要的属性类型。

于 2009-01-07T01:51:44.380 回答
1

http://code.google.com/appengine/docs/python/datastore/modelclass.html#Model_properties

db.Model 具有查找实例上所有属性的方法。

该类公开了一个 Property 对象列表: db.Model.properties()

该实例仅公开动态名称:instance.dynamic_properties()

您想要遍历列表并构建 Property 对象,然后运行 ​​p.validate()。

for p_name in instance.dynamic_properties():
    p = db.RatingProperty()
    p.validate() # raises BadValueError, etc.
于 2011-12-02T16:41:17.270 回答
0

其实很简单!

ExpandoObject实现(IDictionary<String, Object>),所以你只需要这样做:

 dynamic person = new ExpandoObject();
 person.FirstName = "Barack";
 person.LastName = "Obama"

 (((IDictionary<String, Object>)person).Keys  
    => { "FirstName", "LastName" }

 (((IDictionary<String, Object>)person).ContainsKey("FirstName")  
    => true

注意:您需要显式转换为,(IDictionary<string, object>因为 ExpandoObject 显式实现了此接口 - 并且实例本身没有ContainsKey()or Keys

不要期望此方法适用于所有动态对象 - 只是 ExpandoObject 和实现此接口的任何其他对象。

于 2010-12-22T00:45:30.260 回答
0

我可能误解了你的问题,但是如果你有一个你希望找到的属性列表,为什么不直接使用标准的 db.Model,而不是 Expando?您可以向 Model 类添加其他属性,只要您提供默认值或不要求它们。

于 2009-01-07T14:07:47.310 回答