【问题标题】:Expando vs regular Model with blank propertiesExpando 与具有空白属性的常规模型
【发布时间】:2016-02-13 23:46:43
【问题描述】:

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

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 并将每个实体的一些属性留空?

【问题讨论】:

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


    【解决方案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。 (我有许多使用它的项目。例如,一个产品和具有不同附加属性的不同产品类型),例如植物与泵,两者都是基本产品,具有价格、分类、照片等)但是植物会有不同的分类(开花、不开花),泵会有流量、瓦特等)但我可以找到所有低于 $25(植物或其他)的产品Product.query(Product.price < 25)

    【讨论】:

    • 感谢您的回答!如果 Machine 是 StructuredProperty,我也可以这样做吗?我也有一个发生这种情况的案例,就像这样,Mac 不是一个成熟的实体,而是一个 StructuredProperty(更大实体中的一个属性)。在这种情况下,我还能按照你的建议做吗?
    • 虽然最终结果可能相似,但方法不同,并且各有优缺点。嵌套重复属性存在一些限制,并且在许多情况下,对具有嵌套的结构化属性的项目的查询无法按照您希望的方式工作。
    • 在我的情况下,他们没有太多数据,它只与实体相关,从我测试的结果来看,它足以用于查询目的。我的意思是有这样的例子:类“事物”,它有一个结构化的属性机器,它有两种类型:机器A和机器B。这是可能的还是应该避免?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多