1

django には 3 つのモデルがあります。

  • シンプルな製品
  • ConfigurableProduct SimpleProducts のいくつかのバリエーションを表示する代わりに、色などのオプションを備えた 1 つの製品が表示されます。
  • GroupProduct - 一緒に販売される複数の SimpleProducts。

まず、すべての SimpleProducts を作成します。次に、同じ製品のバリエーションであるいくつかの製品から ConfigurableProducts を作成し、最後の GroupProducts はいくつかの SimpleProducts の組み合わせです。

ユーザーがカテゴリに移動するとき、3 つのタイプすべてを表示する必要があります。SimpleProduct が ConfigurableProduct の一部である場合、それを 2 回表示したくありません。

クエリを作成するにはどうすればよいですか? 3 つのいくつかのクエリを作成する必要がありますか? 3 つのモデルで同時にページネーションを使用するにはどうすればよいですか? どういうわけか継承を使用できますか?

ありがとう

4

2 に答える 2

0

この質問は、ビジネスロジックをもう少し明確に理解せずに答えるのは難しいと思います。これが私の仮定です:

  1. 構成可能なオプションはアドホックです。つまり、ボールを赤、青、黄色で販売し、シャツを小、中、大などで販売します。これらのオプションはカテゴリを超えないため、抽象的に表す方法はありません。(もしそうなら、データベース設計はすべて間違っています。すべてにカスタムカラーオプションがある場合は、データベーステーブルにその列を作成するだけです。)
  2. 各構成オプションには、会社に既存のビジネス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_ididpre_saveProductTyperepresentative_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

これは、整合性を強制する必要性を何らかのバリデーターに置き換えるものではありませんが、もう少し抽象的になります。

于 2010-01-07T16:04:51.237 に答える
-1

Djangoのマルチテーブル継承を使用して、直接インスタンス化しない基本クラスを使用します。基本クラスには、クエリを実行できるマネージャーがまだあり、サブクラスインスタンスの基本属性が含まれます。

冗長に表示してはならない構成可能な製品についての質問に取り組むには、2つのオプションがあると思います。

  • 構成可能な製品をConfigurableProductChoiceの複数の選択肢にします(SimpleProductとは関係ありません)。ConfigurableProductChoiceにConfigurableProductを拡張してもらいます。そうすれば、結果に単一のConfigurableProductが含まれ、冗長性がなくなります。
  • 構成可能な製品をさまざまなオプションに関連付け、選択したオプションから価格を計算するルールを設計します。単純な追加で十分です。製品IDは、選択されているオプションをエンコードする必要があります。SimpleProductを使用しなかったため、まだ冗長性はありません。
于 2010-01-07T14:11:05.243 に答える