Expando 与具有空白属性的常规模型
Expando vs regular Model with blank properties
我遇到的情况是,我使用的模型具有所有实体所需的许多属性,以及一些特定于两个备选方案之一的属性,如以下示例所示:
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 并为每个实体保留一些属性空白?
对于你的场景,我会认真考虑使用 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。 (我有很多项目使用这个。例如,一个产品和具有不同附加属性的不同产品类型),例如植物与泵,都是基本产品,有价格、分类、照片等)但植物会有不同的分类(开花的,不开花的),泵会有流量,瓦特等)但我可以通过 Product.query(Product.price < 25)
找到所有低于 25 美元的产品(植物或其他)
我遇到的情况是,我使用的模型具有所有实体所需的许多属性,以及一些特定于两个备选方案之一的属性,如以下示例所示:
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 并为每个实体保留一些属性空白?
对于你的场景,我会认真考虑使用 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。 (我有很多项目使用这个。例如,一个产品和具有不同附加属性的不同产品类型),例如植物与泵,都是基本产品,有价格、分类、照片等)但植物会有不同的分类(开花的,不开花的),泵会有流量,瓦特等)但我可以通过 Product.query(Product.price < 25)