問題の例
たとえば、モデル、、、Publication
および;がPhoto
あります。それらはさまざまな方法で相互に関連する可能性があります。特に、出版物には、1)いくつかのイラスト(関連写真)および2)いくつかの言及されたペルソナを含めることができます。イベントには、3)写真と4)関係者を含めることができます。また、5)イベントは出版物で言及される可能性があります。Event
Person
イラストを除いて、関係に追加のデータを関連付ける必要はありません。並べ替えには位置フィールドが必要です。したがって、その場合(#1)は、Illustration
写真や出版物を参照したり、位置フィールドを指定したりするような中間モデルを使用しても問題ありません。
しかし、ケース2または4では、複雑になります。
ReferencedPerson
たとえば、 (汎用外部キーを介して)任意のタイプのオブジェクトを指すことができるaを指定することは理にかなっているため、パブリケーションとイベントの両方に使用できます。一方、を指定することもできますReferencedEvent
。これは、ケース5と3で使用できますが、ケース4でも使用できます。これは、それが人を参照するイベントであり、その逆ではないとは言えないためです。
ReferencedObject
したがって、ある時点で、2つの一般的な外部キーを使用してモデルを指定することを考えるのに十分なほど乾燥しなくなります。そして、これはクールではありません。これがタグの目的です。タグが別のモデルインスタンスを表すことができれば、それは素晴らしいことです。
アイデア
マシンタグは、名前空間や値、あるいはその両方を含むことができるタグです。それらは次のようnamespace:tag=value
になります(名前空間と値の部分はオプションです)。
マシンタグは、追加のデータを保持するだけでなく、オブジェクト間の関係を表すためにも使用できます。大まかな例はFlickrです。ここでは、たとえば写真にタグを付けることができ、upcoming:event=81334
Upcomingへのリンクとして自動的に表示されます。
実装の可能なバリアント
アプリケーションのmachinetags
ブランチがありdjango-tagging
ます。これは非常に一般的であり、そこにあるタグは参照オブジェクトとは見なされません。ヘルパー関数と、「特別な」マシンタグを参照オブジェクトの人間が読める形式の名前に置き換えるテンプレートタグまたはフィルターを提供するアプリを作成することを考えています。
質問
(複数の場合は申し訳ありません。)マシンタグを使用して、そのようなモデル間の関係を構築することは理にかなっていますか?もしそうなら、Djangoでそれを実装するための最良の方法は何でしょうか?中間モデルを使用する方が良い場合はどうなりますか?私はここで間違った問題を解決していますか?