我正在尝试创建一个NDB属性子类,它允许我将一个Number存储为ndb.IntegerProperty(如果Number是一个int)或者作为ndb.FloatProperty(如果Number是一个float)。
class Integer(ndb.Model):
number = ndb.IntegerProperty()
class Real(ndb.Model):
number = ndb.FloatProperty()
class NumberProperty(ndb.StructuredProperty):
def _validate(self, value):
assert isinstance(value, (int, float))
def _to_base_type(self, value):
if isinstance(value, int):
return Integer(number=value)
else:
return Real(number=value)
def _from_base_type(self, value):
return value.number
然后我创建一个使用此NumberProperty的测试类并尝试创建一个实体:
class MyNumber(ndb.Model):
value = NumberProperty()
MyNumber(value=12)
我收到以下TypeError: init ()至少需要2个参数(给定1个)。
请给我一个提示,我应该如何设置所需的子类。我尝试了很多其他形式,但没有任何效果。感谢。
答案 0 :(得分:0)
尝试这样的事情:
class NumberModel(ndb.Model):
i = ndb.IntegerProperty()
f = ndb.FloatProperty()
class NumberProperty(ndb.StructuredProperty):
def _validate(self, value):
assert isinstance(value, (int, float))
def _to_base_type(self, value):
if isinstance(value, int):
return NumberModel(i=value)
else:
return NumberModel(f=value)
def _from_base_type(self, value):
v = value.i if value.i is not None else value.f
return v
https://developers.google.com/appengine/docs/python/ndb/subclassprop
答案 1 :(得分:0)
最终我发现以下效果最佳:
class NumberProperty(ndb.GenericProperty):
def _validate(self, value):
assert isinstance(value, (int, long, float))
return value