これは興味深い問題です。まず最初に、ユーザーが項目タイプを自分で追加したいかどうか、または事前に定義された数のタイプがあり、必要に応じて開発者だけが新しいタイプを追加できるかどうかを確認する必要があると思います.
静的アイテム タイプ
項目タイプが静的である場合、モデル継承を使用してスキーマを作成できます。したがって、この場合、項目タイプごとに 1 つ以上の抽象基本モデルと具象モデルを定義することをお勧めします。たとえば、次のようにします。
クラスアイテム(モデル.モデル):
slug = models.SlugField()
価格 = モデル.DecimalField()
残り = models.IntegerField()
説明 = models.CharField()
クラスメタ:
抽象=真
class ClothingItem(アイテム):
サイズ = models.CharField()
ブランド = models.CharField()
クラスメタ:
抽象=真
クラス ジャケット(衣料品):
has_hood = models.BooleanField()
クラス Hat(ClothingItem):
hat_type = models.CharField(choices=[])
したがって、上記は実際には Jacket と Hat の 2 つのデータベース テーブルのみを生成し、それぞれのテーブルには継承元のモデルのすべてのフィールドが含まれます。これは非常にクリーンで、フォームを追加してアイテムを取得するためのクエリを生成するのが非常に簡単であるため、ほとんどの人が django で使用するものです。
他のオプションは、抽象基本クラスを使用しないことです。そのため、Item
各フィールドを含むという名前のデータベース テーブルClothingItem
、 への ForeignKey を含む名前の別のテーブル、Item
および への ForeignKey を含む別の名前Jacket
のテーブルを取得しますClothingItem
。Item
これは、またはで集計を生成するのに役立ちますがClothingItem
、django は、Jacket のプロパティを取得するときはいつでも (結合を使用して) 3 つのテーブルにクエリを実行する必要があります。これが必要であると確信している場合にのみ、これを使用することをお勧めします。
動的項目タイプ
この場合、アプリケーションのユーザーが項目のプロパティを定義する必要があるため、別のスキーマを使用する必要があります。あなたは次のようなことをするかもしれません:
クラス カテゴリ (models.Model):
名前 = models.CharField()
クラス属性 (models.Model):
カテゴリ = モデル.ForeignKey(カテゴリ)
名前 = models.CharField
クラスアイテム(モデル.モデル):
slug = models.SlugField()
価格 = モデル.DecimalField()
残り = models.IntegerField()
カテゴリ = モデル.ForeignKey(カテゴリ)
説明 = models.CharField()
attributes = models.ManyToManyField(Attribute, through='ItemAttribute')
クラスItemAttribute(models.Model):
item= models.ForeignKey(アイテム)
属性 = モデル.ForeignKey(属性)
値 = models.CharField()
この設計はもう少し複雑です。ここにあるのは、項目タイプ (帽子、ジャケット、マグカップ、シャツ、ポスターなど) を定義するカテゴリ モデルです。カテゴリの階層を定義することもできますが、これについては演習として残します。属性モデルは、属性の名前を定義します。各属性には、名前と属するカテゴリがあります。したがって、ジャケット カテゴリには has_hood 属性があり、帽子カテゴリには hat_type 属性などがあります。
現在、 Item モデルは Category にも属しており、 ItemAttribute モデルを介して Attribute モデルと多対多の関係を持っています。最後の 1 つは、データベースに次のフィールドを持つ ItemAttribute テーブルがあることを意味します。
項目 - 属性 - 値
したがって、ジャケット 312 には true の値を持つ属性 2(has_hood) があり、ジャケット 313 には false の値を持つ属性 2 があります。
上記の設計には、属性に「タイプ」がないという小さな問題があります。Attribute モデルに _type 属性を追加して、さらに拡張する必要があります。また、この質問に対する回答を確認してください:
Django 動的モデル フィールドは、動的モデル フィールドをより一般的な方法で定義します。
この設計により、ユーザーは新しい属性を作成してカテゴリに割り当てることができるため、新しいアイテムを追加するときに、カテゴリに基づいて属性を入力できます。もちろん、ユーザーがこれを実行できるようにするには、各アイテムの動的属性を含む動的フォームも生成する必要があります。必要に応じて、その方法も説明できます。最初に誰かが信じているほど難しくはありません (ヒント:type
動的な Form クラスを生成するために使用します)。