この質問は、ビジネスロジックをもう少し明確に理解せずに答えるのは難しいと思います。これが私の仮定です:
- 構成可能なオプションはアドホックです。つまり、ボールを赤、青、黄色で販売し、シャツを小、中、大などで販売します。これらのオプションはカテゴリを超えないため、抽象的に表す方法はありません。(もしそうなら、データベース設計はすべて間違っています。すべてにカスタムカラーオプションがある場合は、データベーステーブルにその列を作成するだけです。)
- 各構成オプションには、会社に既存のビジネスIDがあります。赤いボールなどに関連するSKUがいくつかあります。何らかの理由で、可能な構成オプションごとにデータベース行を用意する必要があります。(そうでない場合は、繰り返しますが、すべて間違っています。)
この場合、私の最も簡単な推奨事項は、すべての製品がフィールドを継承する基本クラスを持つことですrepresentative_product_id
。アイデアは、すべての製品について、カテゴリページまたはカタログの他の場所に表示される代表的なバージョンがあるということです。データベースでは、これは次のようになります。
Name id representative_id
red_ball 1 1
blue_ball 2 1
green_ball 3 1
small_shirt 4 4
medium_shirt 5 4
large_shirt 6 4
unique_thing 7 7
djangoクエリについては、F objects
バージョン1.1以降を使用している場合に使用します。ただ:
SimpleProduct.objects.filter(representative_id=F('id'))
これにより、代表IDが独自のIDと一致するクエリセットが返されます。
この時点で、誰かがデータの整合性を要求します。主な条件は、すべての場合において、に一致representative_id
するオブジェクトを指している必要があるということです。バリデーターなどを使用して、これを直接実施する方法があります。列を含むテーブルを除外することで、同じことを効果的に行うこともできます。すなわち:representative_id
id
pre_save
ProductType
representative_id
Products
Name id product_type
_________________________________
red_ball 1 ball
blue_ball 2 ball
green_ball 3 ball
small_shirt 4 shirt
medium_shirt 5 shirt
large_shirt 6 shirt
unique_thing 7 thing
Types
Name representative_id
_______________________________
ball 1
shit 4
thing 7
これは、整合性を強制する必要性を何らかのバリデーターに置き換えるものではありませんが、もう少し抽象的になります。