2011-06-06 160 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字段。它使得查询更加昂贵,因为数据被分成两个不同的表格,所以你应该考虑这种方法是否有利于你的情况。