Django模型字段支持多种类型吗?

4

我有以下(简化的)模型:

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可以由Unit类型或Structure类型填充。有没有一种简单的方法在我的模型中表示这个问题?

我能想到的唯一办法就是有一个单独的模型,如下所示:

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字段可以为空。当我需要数据时,需要确定它是由结构体还是单元构建的。是否有更好的解决方案?

2个回答

3

您需要的是Django文档中所称的"通用关系"。Django已经内置了对它们的支持。


1
链接已经失效,这里是新的链接。 - Antonio Ercole De Luca

1

泛型关系可能是最好的方法,但是如果您计划通过管理面板管理这些模型,则可能会有一些问题。然后,您需要向模型添加一个ModelInline,该泛型关系指向这些模型,但据我所知(如果我错误,请纠正我),除了选择模型类并手动键入实例主键外,没有方便的方法从另一侧选择相关对象(从定义关系的模型)。

选择最佳解决方案实际上取决于您的模型结构以及它们共同拥有的特点。我还有另一个想法,就是使用多表继承,通过定义某个 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字段。这使得查询变得更加昂贵,因为数据分为两个不同的表,所以您应该考虑这种方法是否有益于您的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接