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

Python App Engine NDB数据存储属性子类-浮点或整数,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我正在尝试创建一个NDB属性子类,该子类允许我将数字存储为NDB.IntegerProperty(如果该数字是int)或NDB.FloatProperty(如果该数字是float) 然后,我创建一个使用此NumberProperty的测试类,并尝试创建一个实体: class MyNumber(ndb.Model): value = NumberProperty() MyNumber(value=12) 我收到以下类型错误:init()至少接受2个参数(给定1个) 请给我一个提示,我应

我正在尝试创建一个NDB属性子类,该子类允许我将数字存储为NDB.IntegerProperty(如果该数字是int)或NDB.FloatProperty(如果该数字是float)

然后,我创建一个使用此NumberProperty的测试类,并尝试创建一个实体:

class MyNumber(ndb.Model):
    value = NumberProperty()

MyNumber(value=12)
我收到以下类型错误:init()至少接受2个参数(给定1个)


请给我一个提示,我应该如何设置所需的子类。我尝试了许多其他形式,但都不管用。谢谢。

试试这样:

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

最终我发现以下方法效果最好:

class NumberProperty(ndb.GenericProperty):
    def _validate(self, value):
        assert isinstance(value, (int, long, float))
        return value

您还没有显示在何处/哪个类使用stacktrace引发错误。而且我相信你用_to_base_类型所做的是错误的。这应该是一个存储的低级类型,而不是像整数和实数属性那样的高级实体。这是不必要的,如果没有
\uuuu init\uuuu
方法,那么就不必调用super。
class NumberProperty(ndb.GenericProperty):
    def _validate(self, value):
        assert isinstance(value, (int, long, float))
        return value