【问题标题】:Django Model field with multiple types?具有多种类型的 Django 模型字段?
【发布时间】:2011-06-06 19:03:07
【问题描述】:

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

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 字段之一为空。然后,当我需要数据时,弄清楚它是构建它的结构还是单元。有没有更好的解决方案?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

    【讨论】:

    • 链接失效,here是新链接。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多