序文
Django フレームワーク (現在、安定版 1.4.3) に基づく「コレクション管理システム」を実装しています。
ORM の優れたリレーショナルな性質を工夫して、いくつかの厄介な「オブジェクト指向の側面」を強制します。その使用法について、最小限の例を抽出しようとしました。(免責事項: 完全な機能説明はまた長くて退屈な読み物になるため、設計上の議論に発展しない限り作成しません)。
抜粋した例
Django モデルを使用して OO を大まかにエミュレートするとします。さまざまな属性(= クラスのデータ メンバー) で構成できるリリースモデル (= クラス) があります。その後、異なるインスタンス(= オブジェクト) を同じReleaseに対してインスタンス化できます。各インスタンスは、関連するリリースに存在する属性のすべて/一部/なしの値を格納できます。
これにより、次のモデルが得られます。
#An attribute is a name, that can be given a value at instance level.
class Attribute(models.Model):
name = models.CharField(max_length=60)
#A release can be compared to a class in OO :
# it's a data structure description (the attributes' list).
class Release(models.Model):
name = models.CharField(max_length=60)
#A release is caracterized by a list of attributes
# the same attribute can be present in several releases
attributes = models.ManyToManyField(Attribute, blank=True, null=True)
#An instance entry can be compared to an object in OO :
# it instantiates a release
# it can hold its own value for each of the attributes in this release.
#Nb : Attributes are all optional.
class Instance(models.Model):
#the instantiated release
release = models.ForeignKey(Release)
#Store the actual attribute-value pairs for the different instances.
class InstanceAttribute(models.Model):
instance = models.ForeignKey(Instance)
attribute = models.ForeignKey(Attribute)
value = models.CharField(max_length=60)
問題
そのアプローチで強力な Django admin を使用することは素晴らしいことです。
Releasesを追加し、それらをAttributesで構成するために、すべてがすぐに使用できます。
インスタンスの追加ビューはますます複雑になっています。(関連するリリースID は、次の形式の URL で GET によって転送できます: instance/add/?release=x )。このビューが読み込まれると、次のInstanceAttributeの InlineFormset を提案する必要があります。
- 関連するリリースを構成する属性の数と一致するフォームの数
- これらのフォームのそれぞれについて、AttributeフィールドはReleaseのAttributeに初期化する必要があり、クエリセットはこのAttributeのみを表示するように制限されています。
をオーバーライドして、追加のパラメーターを目的の数値に設定してModelAdmin.get_formsets()
を返すことで、#1 を解決できます。add_view のソース
をよく見てみると、#2 を実装する良い方法が見つかりません...inlineformset_factory