2010-10-24 7 views

Trả lời

3

Hai cách sử dụng phổ biến của Expandos là các lược đồ được sửa một phần và deleting các thuộc tính cũ.

Tôi thường xuyên sử dụng Expando khi tôi có loại cần các thuộc tính hơi khác nhau giữa các thực thể; nói cách khác, khi tôi cần một lược đồ động 'một phần'. Một trường hợp sử dụng là một ứng dụng nhận lệnh khi một số sản phẩm là chất lỏng (nghĩ nước), một số là các đơn vị vật lý (nghĩ DVD), và một số là 'khác' (nghĩ bột). Một số trường, như mã mặt hàng, giá cả và số lượng, luôn cần thiết. Nhưng, điều gì sẽ xảy ra nếu các chi tiết về số lượng được tính toán cũng như thế nào?

Thông thường giải pháp giản đồ cố định là thêm thuộc tính cho tất cả các biến mà chúng tôi có thể sử dụng: trọng lượng, kích thước, trước và sau trọng số của cổ phiếu, v.v. Điều đó thật tệ. Đối với mọi thực thể, hầu hết các trường khác là không cần thiết.

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() 

Với Expando chúng tôi có thể làm tốt hơn nhiều. Chúng tôi có thể sử dụng số unit_of_measure để cho chúng tôi biết cách tính số lượng. Các hàm tính toán số lượng có thể thiết lập các trường động và các hàm đọc thông tin của phương thức đó biết những gì cần tìm. Và, thực thể không có một loạt các thuộc tính không cần thiết.

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 

Bạn có thể đạt được kết quả tương tự bằng cách sử dụng thuộc tính văn bản hoặc đốm màu và nối tiếp giá trị 'khác' với giá trị đó. Expando về cơ bản là 'tự động' cho bạn.

+1

Một tùy chọn khác trong trường hợp bạn phác thảo là sử dụng PolyModel, thay vào đó. –

+1

Bạn có thể; nhưng bạn có thể tạo ra và nhập khẩu tấn mô hình để xử lý các biến thể (đối với loại ví dụ này). Tôi đối phó với chất lỏng, và có một * lot * (ứng dụng của chúng tôi sử dụng khoảng 12) cách để tính toán âm lượng. –

+0

Một trong những lý do giải thích về lý do cho mô hình Expando. Cảm ơn! – Jon