EAV-Djangoはエンティティ - アトリビュート値データモデルの実装を提供し、再利用可能なDjangoのアプリです。
 エンティティ属性値モデル(EAV)、また状況で使用されているオブジェクトの属性と値のモデルとオープンスキーマとして知られている場所のことを記述するために使用できる属性(プロパティ、パラメータ)の数( "実体」または「オブジェクト」)は、潜在的に非常に広大であるが、実際には特定のエンティティに適用される数は比較的控えめです。
EAV-Djangoは伝統的なRDBMS(SQLiteのとMySQLでテスト)で正常に動作します。
優先順位
アプリケーションは、オンラインショップのプロジェクトから成長したので、それは単に学術的な運動はかなり実用的ではない。主な優先事項は次のとおりだった:
  1。データの柔軟性、
とをタップ2。クエリの効率、
  3。コードを編集せずに最大の保守性。
もちろん、これはトレードオフを意味し、目標は、一般的な場合のために少なくとも有害な組み合わせを見つけることだった。
特徴
すべての提供モデルは抽象的である、すなわちEAV-Djangoは独自のテーブル内の任意の情報を保存しません。その代わりに、箱から出してEAVをサポートする必要がありますあなた自身のモデルのための基礎を提供する。
EAV APIが含まれています。
  * /更新/アクセスの作成:モデルインスタンスは、両方の "本当の"フィールドのスタンダールのAPIを提供し、EAV属性。抽象化は、しかし、あなたの方法に立って、基礎となるものに対処するための手段を提供しません。
  *問合せ:BaseEntityManagerは一様フィルタにおけるアプローチ()およびexclude()照会する「本物の」とEAV属性が含まれています。
  *属性のためのカスタマイズ可能なスキーマ。
  *管理者:すべての動的属性が(eav.admin.BaseEntityAdminを使用して)少しの努力なしやで表現し、Djangoのadminに変更することができます。スキーマは、通常のDjangoモデルオブジェクトとして、個別に編集することができます。
  *ファセット:ファセット検索は基本的には、モデルの特定のサブセットユーザーはいくつかの特性の望ましい値を選択できるように、適切なウィジェットと選択肢属性を表すフォームが必要になりますなどのオンラインショップ、カタログ、の重要な特徴である、提出フォームと一致する項目のリストを取得。一般的なケースではジャンゴ·フィルタが行うだろうが、それはEAVでは動作しませんので、EAV-Djangoはそのための完全なツールセットを提供します。
の例の
それでは、EAVに優しいモデルを定義EAV属性を作成し、それがどのように動作するか見てみましょう。 「EAV属性」によって、私は個別のオブジェクトとしてデータベースに格納されているが、アクセスされ、彼らは、エンティティのテーブルの列であるかのような方法で検索されたものを意味する:
django.db輸入モデルから
eav.modelsからBaseEntity、BaseSchema、BaseAttributeをインポート
クラスフルーツ(BaseEntity):
 タイトル= models.CharField(max_lengthを= 50)
クラススキーマ(BaseSchema):
 パス
クラスのAttr(BaseAttribute):
 スキーマ= models.ForeignKey(スキーマ、にrelated_name = 'のattrs')
Pythonシェルで#:
#は、「色」という名前の属性を定義する
>>>色= Schema.objects.create(
...タイトル= '色'、
タイトルから/ slugify移入する...名= '色'、#を省略
...データ型= Schema.TYPE_TEXT
...)
#エンティティを作成
>>> E = Fruit.objects.create(タイトル= 'アップル'、色=「グリーン」)
# "本物"を定義し、EAVは、同じように属性
>>> e.title
'林檎'
>>> e.colour
「グリーン」
>>> EAVとe.save()#お得な情報を自動的に属性
Attrのインスタンスとして#リストEAV属性
>>> e.attrs.all()
[
EAV属性による#検索それは普通のフィールドであるかのように
>>> Fruit.objects.filter(色= '黄色')
[<フルーツ:アップル>]
#すべての複合検索はサポートされています。
>>> Fruit.objects.filter(colour__contains = 'エール')
[<フルーツ:アップル>]
我々がアクセスできることに注意してください、変更、およびクエリの色、それが真のエンティティフィールドであるかのように、しかし同時に、その名前、タイプ、さらにはexistanceが完全にスキーマインスタンスによって定義されています。スキーマ·オブジェクトは、クラスとして理解することができ、および関連のAttrオブジェクトは、そのインスタンスである。言い換えれば、スキーマ·オブジェクトのみがデータレベルで定義されているCharFieldと、IntegerFieldとし、そのような、のように、Pythonでハードコードされていません。そして、彼らは(あなたが責任のEAV-Djangoのエリアの外にあるカスタムの制約を置く限り)すべてのエンティティの「インスタンス化」することができます。
属性の名前は、関連するスキーマで定義されています。これは、名前が変更されると、コードが破損しようとしていることを懸念につながり得る。名前が唯一の直接手動検索に使用されるような実際にはそうではありません。他のすべての場合でルックアップがハードコードされた名前なしで構築されており、EAVオブジェクトが主キーによってではなく、名前で連結している。名前はフォーム場合には存在するが、フォームは、メタデータの現在の状態に応じて生成されているので、あなたが安全にスキーマの名前を変更することができます。あなたは、管理インターフェースから破ることができることのタイプである。スキーマのデータ型を変更すると、そのすべての属性が同じままになりますが、その値を保存するために別の列を使用します。あなたはデータ型を復元すると、以前に格納された値が再び表示されます。
より多くの例のテストを参照してください。
データ型
メタデータ駆動型の構造は柔軟性を拡張しますが、いくつかのトレードオフを意味します。その一つは、JOINを(したがって、より遅いクエリ)の数の増加である。別の、より少ないデータタイプである。理論的には、我々は保存のために利用可能なすべてのデータ型をサポートすることができますが、実際にはわずか数が使用されていて、属性ごとに多くの列を作成することを意味だろう - 私たちはEAVを使用することによって避けるためにしようとしていたかを正確に。 EAV-Djangoはのみ(必要に応じてこのリストを拡張することができますが)いくつかの基本的なタイプをサポートしています理由です:
&NBSP; * Schema.TYPE_TEXT、TextFieldに。
&NBSP; * Schema.TYPE_FLOAT、小数を扱う。
&NBSP; * Schema.TYPE_DATE、日付フィールド。
&NBSP; * Schema.TYPE_BOOL、NullBooleanField。
&NBSP; *複数の選択肢(値のすなわちリスト)のためSchema.TYPE_MANY。
すべてのEAV属性はエンティティとスキーマへの参照のユニークな組み合わせでテーブル内のレコードとして記憶されている。 (エンティティはcontenttypesのフレームワークを介して参照され、スキーマが外部キーを介して参照されている。)つまり、特定のエンティティとスキーマを持つ1つの属性のみが存在することができます。スキーマは、属性の定義である。スキーマは、名前、タイトル、データの種類と、このスキーマの任意の属性に適用される他のプロパティの数を定義します。私たちがアクセスしたり、EAV属性を検索すると、EAV機械は常に属性のメタデータとしてスキーマを使用しています。なぜ?属性の名前は、関連するスキーマに格納され、値は、属性テーブルの列に格納されているため。私たちは、メタデータを見てまで、それがどの列かわからない。
上方に設けられた例では、テキスト属性でのみプレイしました。その他のすべての型は正確にTYPE_MANYを除いて同じ動作をします。それは選択のための余分なモデルを含むように、多対多の特別な場合である。 EAV-Djangoは抽象モデルを提供しますが、属性モデル( "選択"という名前すなわち置く外部キー)からそれに具体的なモデル(例えば選択)、及びポイントを定義する必要があります。選択モデルは、スキーマを指すようになります。例えばテストをチェックします。
のこのリリースのの新機能である:ます。
- /更新/アクセスの作成:モデルインスタンスを提供する双方&QUOTためのスタンダールAPI、リアル&QUOT。フィールドおよびEAV属性。抽象化は、しかし、あなたの方法に立って、基礎となるものに対処するための手段を提供していませんします。
- クエリ:BaseEntityManagerは((フィルターに均一なアプローチが含まれます)と除外する)クエリ&QUOTする、リアル&QUOT。とEAV属性ます。
- の属性のカスタマイズ可能なスキーマます。
- 管理者:すべての動的属性が(eav.admin.BaseEntityAdminを使用して)少しの努力なしやで表現し、Djangoのadminに変更することができます。スキーマは、通常のDjangoモデルオブジェクトとして、個別に編集することができます。
- ファセット:ファセット検索は基本的には、モデルの特定のサブセットユーザーはいくつかの特性の望ましい値を選択できるように、適切なウィジェットと選択肢属性を表すフォームが必要になりますなどのオンラインショップ、カタログ、の重要な特徴である、提出フォームと一致する項目のリストを取得。一般的なケースではジャンゴ·フィルタが行うだろうが、それはEAVでは動作しませんので、EAV-Djangoはそのための完全なツールセットを提供します。
の要件の
- のPythonます。
- ジャンゴます。
コメントが見つかりません