0

製品とバリエーションを含む単純な e コマース サイトがあります。

各バリエーションには間違いなく異なる重みがあり、各重みには量があります。

各バリエーションは異なる重みを持つことができ、各重みには数量があるため、Variation への ForeignKey 関係を持つ Weight モデルを実装しました。

class Weight(models.Model):
    variation = models.ForeignKey(Variation)
    size = models.DecimalField(decimal_places=3, max_digits=8, 
                            validators=[MinValueValidator(Decimal('0.10'))])
    quantity = models.PositiveIntegerField(null=True, blank=True, help_text="Select Quantity for this size") 

重量をインラインで追加し、バリエーションに複数の重量値と数量を追加できます。こちらをご覧くださいhttp://imgur.com/XLM6sQJ

これは、重量ごとにバリエーションを作成することで可能になると思われるかもしれませんが、各製品の重量が異なることは明らかであるため、重量ごとにバリエーションを作成する必要はありません。

今私が直面している問題は、各バリエーションの重量が異なるため、たとえば、バリエーションの重量が 1 ポンド、2 ポンド、3 ポンドになる可能性があることです。これらはそれぞれ、バリエーションごとに新しいウェイト オブジェクトを作成します。これは、別のバリエーションにも 1 ポンド、2 ポンド、3 ポンドの重量がある場合、新しいオブジェクトが作成され、既存のものは再利用されないことを意味します。これにより、多くの重複する重み値を持つ巨大なデータベース テーブルが作成されます。どの製品にも必要な重量と数量の値は限られているため (重量 = 1 ポンドから 100 ポンド、数量 = 1 から 100)、理想的にはこれらを再利用する必要があるため、これは問題です。

これを避けるために、ManyToMany フィールドを持つ Weight モデルを Variation に設定し、選択した各 Weight の数量をドロップダウンにすることを考えています。これにより、重量と数量の両方の値を保存し、各製品が各インスタンスで同じ値を使用できるようになります。

私が抱えている問題は次のとおり
です。1.これは正しいアプローチですか?
2.そうでない場合、これを行うための最良のアプローチは何ですか?
3.これが正しいアプローチである場合、これを行う方法は?
4.これが正しいアプローチである場合、各重量にも数量が必要なため、管理サイトでこれを表示するにはどうすればよいですか (これを行う方法がわかりません)。
5.これを達成するためのより良い方法はありますか?

4

1 に答える 1

0

あなたはそれをどのようにやりたいかについて明確に理解しています。

同じ重みを持つ新しいものを作成するのではなく、さまざまなバリエーションに同じ重みを再利用することに同意します。これは、それを行う方法が複数ある可能性があると私が思うことです。

あなたの質問に答えるには、アプリで次のモデル関係を試してください。

 class Quantity(models.Model):
     quantity = models.PositiveIntegerField()

 class Weight(models.Model):
     weight = models.PositiveIntegerField()
     quantity = models.ManyToManyField(Quantity)


 class Variation(models.Model):
     name = models.CharField()
     weight = models.ManyToManyField(Weight)

次に、Weights クラスに必要なすべての重みを個別に追加します。そのため、Variation テーブルに重みを追加する必要がある場合はいつでも、必要な重みを既に追加した Weights クラスから重みを選択できます。

このようにして、レコードを重複させることなく、同じ重みをさまざまなバリエーションに再利用できます。

簡単にアクセスできるように、両方のモデルが管理者に登録されていることを確認してください。

これにより、重みテーブルに複数のレコードがあるという問題が解決されるはずです。

于 2016-08-07T15:46:09.350 に答える