我有以下(简化)模型:
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。然后,当我需要数据时,确定它是由它构建的结构还是单元。对此有更好的解决方案吗?
答案 0 :(得分:3)
你想要Django文档所称的“generic relation”。 Django内置了对它们的支持。
答案 1 :(得分:1)
通用关系可能是最好的方法,但如果您计划通过管理面板管理此类模型,那么它可能会有点问题。然后你必须向模型添加ModelInline,这是通用关系所指向的,但据我所知(如果我错了,请纠正我),没有方便的方法从另一个中挑选相关对象side(来自model,其中定义了relation),而不是选择模型类和手动输入实例主键。
选择最佳解决方案实际上取决于模型的结构以及它们的共同点。我的另一个想法是使用Multi-table inheritance,定义一些BasicObject
作为Structure
和Unit
模型的父对象:
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
现在,所有Structure
和Unit
对象也都是BasicObject
个实例,您可以使用正确的builtFrom
实例填充BasicObject
字段。它使查询更加昂贵,因为数据被分为两个不同的表,因此您应该考虑这种方法是否对您的情况有益。