Expando与具有空白属性的常规模型

时间:2016-02-13 23:46:44

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

我的情况是,我使用的模型具有所有实体所需的许多属性,以及一些特定于两个替代方案之一的属性,如下例所示:

class Machine(ndb.Model):

    #Properties for all machines:
    price = ndb.FloatProperty()
    model = ndb.StringProperty()
    vendor = ndb.KeyProperty()
    #...

    #Properties exclusive to type A machines:
    foo1 = ndb.StringProperty()
    foo2 = ndb.StringProperty()

    #Properties exclusive to type B machines:
    bar1 = ndb.StringProperty()
    bar2 = ndb.StringProperty()

根据我的理解,我可以采取两种途径之一。要么我使它成为常规的ndb.Model,只留下一些没有内容的属性,或者我可以使用ndb.Expando模型并提前设置固定属性,并根据具体情况添加其他属性。

据我了解,当你不知道你需要的属性时,Expando模型很有用,但我事先知道所需的所有属性(foo1,foo2,bar1,bar2)。我应该使用Expando还是可以使用常规的ndb.Model并为每个实体留下一些空白属性?

1 个答案:

答案 0 :(得分:1)

对于您的场景,我会认真考虑使用ndb.PolyModel

class Machine(ndb.Model):

    #Properties for all machines:
    price = ndb.FloatProperty()
    model = ndb.StringProperty()
    vendor = ndb.KeyProperty()

class MachineA(Machine):
    foo1 = ndb.StringProperty()
    foo2 = ndb.StringProperty()

class MachineB(Machine):
    bar1 = ndb.StringProperty()
    bar2 = ndb.StringProperty()

然后,您可以查询所有计算机,

由Machine.query()或具有MachineB.query()的单个机器类型

只是我的2c。 (我有很多项目使用它。例如,产品和具有不同附加属性的不同产品类型),例如工厂与泵,两者都是基本产品,价格,分类,照片等)但是工厂将有不同的分类(开花,非开花)和泵将有流量,瓦特等)但我可以找到所有所有产品较少&lt; Product.query(Product.price < 25)

$ 25(工厂或其他)