0

我在這,我用一個型號有許多需要的所有實體和一些特定於兩個備選方案中的一個,就像在下面的例子中性能的情況經常型號:爲Expando VS空白的屬性

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 Model很有用,但我事先知道所需的所有屬性(foo1,foo2,bar1,bar2)。我應該使用Expando還是使用常規的ndb.Model併爲每個實體留下一些屬性爲空?

回答

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)

+0

感謝您的回答!如果Machine是StructuredProperty,我也可以這樣做嗎?我也有這種情況發生,完全像這樣,而不是Machine是一個完整的實體,它是一個StructuredProperty(一個更大的實體內的屬性)。在這種情況下,我仍然可以按照你的建議去做嗎? –

+0

雖然最終的結果可能相似,但方法不同,各有優缺點。在嵌套重複屬性方面存在一些限制,並且對於嵌套的結構化屬性的項目的查詢在許多場景中無法按照您喜歡的方式工作。 –

+0

在我的情況下,他們沒有太多數據,它只與實體相關,並且從我測試過的數據來看,它足以用於查詢目的。我的意思是有這樣的例子:class「Things」具有結構化屬性Machine有兩種類型:MachineA和MachineB。這是可能的還是應該避免它? –