2009-02-26 93 views
2

我想問一下關於在Django中使用虛擬字段設計模型時最優雅的方法......Django - 用虛擬域設計模型?

假設我們正在構建系統中的在線商店和所有產品由型號「產品」定義。

class Product(models.Model): 
    # common fields that all products share 
    name = ... 
    brand = ... 
    price = ...  

但商店將有大量的產品類型與海誓山盟完全無關,所以我需要一些方法來存儲不同的產品類型的這些虛擬域(即MP3播放器的容量,一本書的,. PAGECOUNT )。

我可以拿出我的原Django的技能解決方案是遠遠不夠完善,到目前爲止:

  • 有一個「custom_fields」屬性 和我 手動管理中間表。與Python的 危險的exec-eval語句飛(以 尖叫醜陋的我的臉:))

  • 或者從 繼承班「產品」(即太 多巫術維護 並實施 需要了解Django內部知識)。

你對此有何看法?

TIA。

回答

13

產品有功能。

class Feature(models.Model): 
    feature_name = models.CharField(max_length=128) 
    feature_value = models.TextField() 
    part_of = models.ForeignKey(Product) 

就像那樣。

只是一個功能列表。

p= Product("iPhone", "Apple", 350) 
p.save() 
f= Feature("mp3 capacity", "16Gb", p) 
f.save() 

如果需要,您可以在一個單獨的表中具有功能名稱的主列表。不要過度分析功能。你不能對它們進行任何處理。你所做的只是呈現它們。

+1

具有公共字段的抽象模型也是處理此問題的有用方法。 – 2009-03-01 01:24:59

3

Ruby on Rails有一個「序列化」字段,允許您將字典打包到文本字段中。也許DJango提供類似的東西?

This article有一個SerializedDataField的實現。

0

圍棋與繼承。使用其自己的附加字段創建生產子類。