Modelの継承の話だと思った人はごめんなさい。
models.Modelと別のニュースタイルクラスを多重継承して、実際のModelクラスを作るというだけの話。
職業Javaプログラマだから多重継承慣れしていないのです。
PHPで多重継承をお探しの方へ。
PHPでは実験的ステータス で「オブジェクトの合成関数」があるようです。
Rhaco 1.0.1を使うと、オブジェクトの合成をmixinという手法で行うことができます。RhacoはPHP4/5で動作するフレームワークです。
ことの発端
中国で、Django製の Blogが公開 されました。
これが、ちょっとDjangoらしからぬ作りなわけです。あれがDjangoの書き方だと思われると、ちょっとよろしくない(私にもいろいろと覚えがあるコードの書き方が多いので、しばらくすれば古い考えに縛られていることに気づくでしょうが)。
他にも思うところもあり、Djblogkitを改良して「比較的簡単に関連コンテンツのモデルを定義できて、関連コンテンツ同士をひもづける。一応UIはAjaxを使う」ものを作ろうという訳です。
で、関連コンテンツの関連コンテンツたる部分を共通化&利用する関連コンテンツの種別判別に多重継承を使っています。
関連コンテンツの枠組み自体は、Djangoがビルトインでもっているコンテンツタイプというものを使うのですが、OneToManyでの利用例しか見かけません。
いくつかもメモ
content_type_idからモデルクラスを取得して、特定のクラスのサブクラスであることを検証する
def is_relatable(field_data, all_data):
"""ForeignKeyField(ContentType, validator_list=[is_relatable])とすれば、管理インターフェースでも、汎用ビューでも、AutomaticManipulatorを使う限りは自動で検証されます。 """
c = ContentType.objects.get(pk=field_data).model_class()
if not issubclass(c, RelatedModelBase):
raise ValidationError, _("You must select Only Relatable Model(%s isn't)" % c._meta.object_name)
ContentTypeから取り出したモデル情報からデフォルトマネージャを利用する
main_object_class = ContentType.objects.get(pk=content_type_id).model_class()
main_object = main_object_class._meta.admin.manager.get(pk=object_id)
実のところ
「スパムとか」はコンテンツタイプを既にManyToManyで使っています。ただし、使うのは自分自身なので作り込んでいません。