Django模型字段有多种类型?

时间:2011-06-06 19:03:08

标签: django django-models

我有以下(简化)模型:

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)

但是,可以从Unit类型或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字段设为null。然后,当我需要数据时,确定它是由它构建的结​​构还是单元。对此有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

你想要Django文档所称的“generic relation”。 Django内置了对它们的支持。

答案 1 :(得分:1)

通用关系可能是最好的方法,但如果您计划通过管理面板管理此类模型,那么它可能会有点问题。然后你必须向模型添加ModelInline,这是通用关系所指向的,但据我所知(如果我错了,请纠正我),没有方便的方法从另一个中挑选相关对象side(来自model,其中定义了relation),而不是选择模型类和手动输入实例主键。

选择最佳解决方案实际上取决于模型的结构以及它们的共同点。我的另一个想法是使用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个实例,您可以使用正确的builtFrom实例填充BasicObject字段。它使查询更加昂贵,因为数据被分为两个不同的表,因此您应该考虑这种方法是否对您的情况有益。