14

少なくとも私にとっては、これは少しトリッキーだと思います。:)

したがって、 PersonSingerBassistNinjaの 4 つのモデルがあります。

Singer、Bassist、Ninja は Person を継承しています。


問題は、各 Person がそのサブクラスのいずれかになる可能性があることです。

例えば、人は歌手にも忍者にもなれる。別の人はベーシストと忍者になることができます。もう1つは3つすべてにすることができます。

モデルをどのように編成すればよいですか?


助けていただければ幸いです。

4

4 に答える 4

15

多重継承はデータベースではうまく機能しません (そして、Django モデルは最終的にデータベースにマッピングする必要があります)。また、継承はしばしば「役割」をモデル化するための悪い方法です (人々の役割は変化するため)。Singer、Bassist、Ninjaを Person のサブクラスではなく「ロール」として設定し、それらを外部キーで接続します。

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

class Person(models.Model):
    # ...
于 2010-03-22T02:09:11.923 に答える
3

原則として、次のようなことができます。

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

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

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

しかし、Person.roles.objects.all() が Role のインスタンスしか提供できないという問題に遭遇します。したがって、Role の各インスタンスを Ninja や Pirate などの適切なサブクラスにキャストするメソッドが必要です。この問題について議論しているスレッドへのリンクを次に示します。

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

要するに、Alex と Stefano は私よりも有益な回答をしてくれました。

于 2010-03-22T12:53:39.253 に答える
2

Alex が示すように、ロール ソリューションについては同意します。あなたが持っているのは、人々の異なるサブクラスではありません。あなたには、人が持つことができるさまざまな役割があります。

しかし、あなたが言うのを聞いたことがあります:「おい、忍者はプロパティ「numberOfStars」を持つことができ、歌手はプロパティ「highestNote」を持つことができる一方、シンガーは sing() と getWasted() を持つことができ、ベーシストは goFunky() と slapPop() を持つことができます。

ここにあるのは、データ モデルが非常に緩いスキーマを必要とする場合です。非常に緩いため、実際にはスキーマがまったくありません。歌手がベースを取り、曲を即興で演奏することに決めた場合、それは問題ありません。彼が忍者として行動したい場合、throwStar を呼び出すと、星がないためエラーが返されますが、原則として、歌手に星を割り当てて星を投げさせることができます。

あなたが冒険しているのは、スキーマではなく、オントロジーの世界です。「何か」であるリソースがあり、この何かは何らかのタイプであり、いくつかのプロパティを持つことができます。一部のプロパティの存在はタイプを推測でき、一部のタイプの存在は他のタイプを推測できます。単純な django データ モデルでは、この情報を簡単に記述することはできません。必要なのは、AllegroGraph などのコンテキスト認識型の推論グラフ ストアか、rdflib を使用してハッキングされたソリューションを実装することです。

于 2010-03-22T03:20:34.953 に答える