App Engine NDB数据存储属性子类 - 浮点数或整数

时间:2014-04-16 22:05:06

标签: python google-app-engine google-cloud-datastore

我正在尝试创建一个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个)。

请给我一个提示,我应该如何设置所需的子类。我尝试了很多其他形式,但没有任何效果。感谢。

2 个答案:

答案 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