棘手的模型继承Djang

2024-06-16 12:07:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得这有点棘手,至少对我来说。:)

所以我有4个模特儿歌手贝司手忍者。在

歌手,贝司手和忍者继承人。在


问题是每个人都可以是它的任何一个子类。在

一个人可以是歌手和忍者。另一个人可以是贝司手和忍者。另一个可以是三个。在

我应该如何组织我的模型?在


我们将非常感谢您的帮助!在


Tags: 模型子类歌手棘手继承人忍者模特儿
3条回答

多重继承不能很好地与数据库一起工作(而且您的Django模型最终确实需要映射到一个数据库),并且继承通常是对“角色”建模的坏方法(因为人们的角色确实会发生变化)。我会让歌手、贝司手和忍者作为“角色”,而不是作为Person的子类,并通过外键将它们连接起来:

class Singer(models.Model):
    person = models.ForeignKey('Person')
    # ...

class Person(models.Model):
    # ...

原则上,您可以执行以下操作:

class Role(models.Model):       
     ......

class Ninja(Role):
     .......

class Person(models.Model):
      roles = models.ManyToManyField(Role)

但是你遇到了一个问题人.角色.对象.all()只能提供角色的实例。因此,您需要一个方法将角色的每个实例强制转换为一个合适的子类,如Ninja或Pirate。这里有一个链接指向一个讨论这个问题的线程。在

http://groups.google.com/group/django-users/browse_thread/thread/f4241bc16455f92d/7268c3f7bca6b046

总之,亚历克斯和斯特凡诺给出了比我更有用的答案。在

我同意Alex描述的角色解决方案。你所拥有的并不是不同的人的子类。一个人可以扮演不同的角色。在

但是我听到你说:“嘿,忍者可以有一个属性“numberOfStars”,而歌手可以有一个属性“highestNote”。与接口相同:忍者可以使用throwStar()和execase()方法,而歌手可以使用sing()和getWasted(),贝司手可以使用goFunky()和slapPop()

这里的情况是,您的数据模型需要一个非常松散的模式。太松散了,事实上,你根本没有模式。如果歌手决定用低音和即兴曲,那没关系。如果他想扮演一个忍者,你叫它throwStar,它会返回一个错误,因为他没有星星,但原则上你可以给一个歌手分配星星,让他扔星星。在

你所要冒险的是本体论的世界,而不是模式。你有一个资源,它是“something”,这个something可以是某种类型,有一些属性等等。一些属性的存在可以推断类型,或者某个类型的存在可以推断其他类型。您不能用简单的django数据模型轻松地描述这些信息。你需要的是一个上下文感知的推断图存储,比如AllegroGraph,或者使用rdflib实现你的破解方案。在

相关问题 更多 >