私は次のモデルがあります。それらの中に複数のFruit
オブジェクトを持つことができますDjangoのモデル関係の最善の解決策
Basket
とFruit
Basket
を、そしてFruit
は単一Basket
に属します。各Fruit
は、手動で注文することができます。一覧に表示されるときに、保存された順序が表示されます。ここまでは順調ですね。
class Basket (models.Model):
# A fruit basket
name = models.CharField(max_length=100)
is_virtual = models.BooleanField(default=False)
# This is just a badly constructed example of how a list
# of basket primary keys are saved when creating the virtual basket
# This is only for demonstration purposes to solve the overall modelling issue
virtual_baskets = models.TextField(null=True)
class Fruit (models.Model):
# The basket this fruit belongs to
basket = models.ForeignKey("Basket", related_name="fruits", on_delete=models.CASCADE)
# Manually sorted order
order = models.PositiveIntegerField(default=0)
しかし、ユーザーはあなたが少しのルールを破って終了した既存の、本当のバスケット、外の仮想コンボバスケットを作成することができますis_virtual
呼ばBasket
上のフラグがあります:仮想バスケットは実際に組み合わせることができます2つのバスケットからのBaskets
、したがってFruit
の2つが存在します。これらのバスケットにあるFruit
を手動でソートして並べ替えることができるようにするには、元のバスケットの順序を上書きしないでください。一例として、
:
Basket A
は順番に、含まれています:アップル、バナナ
Basket B
が含まれ、順番に:オレンジ、ブドウは
私は今、表示されるでしょう仮想Basket C
を作成したいです
アップル、ブドウ、バナナ、オレンジ
覚えておくべき注意:バーチャルバスケットは、他のさまざまなバスケットの結果を単純に結合することです。ユーザーにはそれでも有効なバスケットで、果物を再注文できるはずです。
この注文関係をモデル化するにはどうすればよいですか?新しいモデルを追加することを検討しています:
class FruitAppearance (models.Model):
# The basket this appearance is tied to
basket = models.ForeignKey("Basket", related_name="manually_sorted_fruits", on_delete=models.CASCADE)
# The fruit it represents
fruit = models.ForeignKey("Fruit", on_delete=models.CASCADE)
# Order
order = models.PositiveIntegerField(default=0)
私はそれを正しく考えていますか?より良い方法がありますか?既存のFruit
とBasket
モデルのManyToManyFieldを使用する必要がありますか?
フルーツは単一のバスケットに属します。 –
正しい、それは単一の実際のバスケットにしか属していませんが、バーチャルバスケットで異なる方法で提示することができます – strangetimes
バーチャルバスケットはもちろん保存することができ、手動のフルーツオーダーはそれにとどまらなければなりません – strangetimes