2011-06-06 230 views
3

我有以下的(簡化)型號:Django模型字段有多種類型?

class Structure(models.Model): 
name=models.CharField(max_length=100, unique=True) 

class Unit(models.Model): 
name=models.CharField(max_length=100, unique=True) 

每個型號,也有builtFrom領域,這顯示了該項目的建成,例如:

class Unit(models.Model): 
name=models.CharField(max_length=100, unique=True) 
builtFrom=models.ForeignKey(Structure) 

然而,builtFrom能從單元類型或結構類型填充。有沒有一種簡單的方法可以在我的模型中表示這一點?

我能想到的唯一的事情是有一個獨立的模型,就像這樣:

class BuiltFromItem(models.Model): 
structure=models.ForeignKey(Structure) 
unit=models.ForeignKey(Structure) 


class Unit(models.Model): 
name=models.CharField(max_length=100, unique=True) 
builtFrom=models.ForeignKey(BuiltFromItem) 

,然後讓BuiltFromItem領域之一,只是爲空。然後,當我需要這些數據時,請確定它是從其構建的結構還是單元。有更好的解決方案嗎?

回答

1

如果您打算通過管理面板管理這些模型,通用關係可能是最好的方法,但它可能有點問題。然後你需要在模型中添加一個ModelInline,這個泛型關係指向的是模型,但據我所知(如果我錯了,就糾正我),沒有從對方挑選相關對象的簡便方法(從模型,其中定義關係),除了選擇模型類和手動輸入實例主鍵以外。

選擇最佳解決方案實際上取決於模型的結構以及它們的共同點。另一個想法我有,就是用Multi-table inheritance,定義一些BasicObject作爲父對象StructureUnit型號:

class BasicObject(models.Model): 
    name=models.CharField(max_length=100, unique=True) 
    #other common data 
    builtFrom=models.ForeignKey('BasicObject') 

class Structure(BasicObject): 
    #data specific to Structure 

class Unit(BasicObject): 
    #data specific to Unit 

現在所有StructureUnit對象也將BasicObject情況下,你就可以用適當的BasicObject實例填充builtFrom字段。它使得查詢更加昂貴,因爲數據被分成兩個不同的表格,所以你應該考慮這種方法是否有利於你的情況。