2010-10-24 4 views

cevap

3

Expandos'un iki yaygın kullanımı, kısmen sabit şemalar ve deleting eski özelliklerdir.

Genellikle, Expando'yu, varlıklarda biraz farklı özelliklere gereksinim duyan türlerdeyken kullanırım; Başka bir deyişle, “kısmen” dinamik bir şemaya ihtiyacım olduğunda. Bir kullanım vakası, bazı ürünlerin sıvı olduğu (düşünce suyu), bazılarının fiziksel birimler (DVD'ler) ve bazılarının “öteki” (düşünce unu) olduğu siparişleri alan bir uygulamadır. Ürün kodu, fiyat ve miktar gibi bazı alanlar her zaman gereklidir. Ancak, miktarın nasıl hesaplandığına dair detaylar da gerekiyorsa?

Genelde, sabit şema çözümü, kullanabileceğimiz tüm değişkenler için bir özellik eklemektir: ağırlık, boyut, stokumuzun ağırlıklarından önce ve sonra vb. Bu berbat. Her varlık için diğer alanların çoğu gerekli değildir.

class Order(db.Model): 
    # These fields are always needed. 
    item_code = db.StringProperty() 
    unit_of_measure = db.StringProperty() 
    unit_price = db.FloatProperty() 
    quantity = db.FloatProperty() 

    # These fields are used depending on the unit of measure. 
    weight = db.FloatProperty() 
    volume = db.FloatProperty() 
    stock_start_weight = db.FloatProperty() 
    stock_end_weight = db.FloatProperty() 

Expando ile daha iyisini yapabiliriz. Miktarı nasıl hesapladığımızı anlatmak için unit_of_measure kullanabiliriz. Miktarı hesaplayan fonksiyonlar dinamik alanları belirleyebilir ve bu metodun bilgisini okuyan fonksiyonlar neyi arayacağını bilir. Ve varlığın bir dizi gereksiz özelliği yoktur.

class Order(db.Expando): 
    # Every instance has these fields. 
    item_code = db.StringProperty() 
    unit_of_measure = db.StringProperty() 
    unit_price = db.FloatProperty() 
    quantity = db.FloatProperty() 


def compute_gallons(entity, kilograms, kg_per_gallon): 
    # Set the fixed fields. 
    entity.unit_of_measure = 'GAL' 
    entity.quantity = kilograms/kg_per_gallon 

    # Set the gallon specific fields: 
    entity.weight = kilograms 
    entity.density = kg_per_gallon 

Bir metin veya blob özelliğini kullanarak ve ona 'öteki' değerinin bir dicti seri ile benzer bir sonuç elde edebiliriz. Expando temelde sizin için 'otomatikleştirir'.

+1

Anahatta gördüğünüz durumun başka bir seçeneği de PolyModel kullanmaktır. –

+1

Yapabilirsiniz; ancak varyasyonları ele almak için tonlarca model oluşturup içe aktarabilirsiniz (bu tür bir örnek için). Sıvılarla ilgilenirim ve bir lot lotu (uygulamamız 12'yi kullanır) vardır. –

+0

Expando modelinin nedenlerinin en başarılı toplamalarından biri. Teşekkürler! – Jon