0

StoryクラスとSeriesクラスの間の関係をモデル化したいと思います。 (つまり、小説の三部作) 関係は「1対多数」(一連のストーリーは多数含むことができますが、ストーリーは1つのシリーズのみに含めることができます)です。 モデルワイズこれは単にDjangoの一対多の外部関係におけるアソシエーション属性

part_of = models.ForeignKey(Series 
          , on_delete=models.CASCADE 
          , related_name='contains_story') 

、ストーリー上の外部キーによって解決することができしかし、私はこの関係の属性としてのシーケンス番号をしたいと思います。 (1:長い地球、2:長い戦争、3:長い火星、...)。 私はそれをストーリーの属性にすることができますが、それはきれいではありません。シリーズの一部ではなく、ストーリー番号はシーケンス番号を持つべきではありません。

「多対多」では、「スルー」オプションを使用して解決できます。 クラスを指定し、そのクラスに属性を追加することによって、

part_of = models.ManyToManyField(Series, through='SeriesPart') 

しかし、「シリーズの部」は「多対多」の関係ではなく、私はこのようにそれをモデル化し、コードでそれを制限することを避けるためにしたいので、どのように私がすべきこのベストを解決する?

+0

私はあなたのユースケースについてはわかりませんが、外部キーのような音は方法ですが、なぜあなたは 'Story'にシリアル番号を付けたくないのか分かりません。 –

+0

これはシリアル番号ではなく、シーケンス内の順序です。シーケンスの一部ではないストーリーは、その属性を持つべきではありません。 – Chabu

答えて

0

私はあなたの異論が大変なことを確信しています。あなたが多対多リレーションシップのthroughテーブルに余分なアトリビュートを格納する理由は、リレーションシップの各側が複数のアイテムを持つことができ、アトリビュート値が特定の特定の組み合わせにのみ関連するためです。 (example in the Django docsの場合、彼はビートルズにあった前にジョンはクオリーメンにあったので、ジョン<に別々のjoined_date値がある - >クオリーメン、ジョン< - >ビートルズ、ポール・< - 。>ビートルズは)

あなたの場合、ストーリーは1つのシリーズの一部にしかなりません。 Pratchett/Baxterシリーズのパート1以外のThe Long Earthには他のポジションはありません。それは同時にそれの部分1であることはできませんが、他の何かの部分2であることはできません。だから、ストーリーモデルそのものにシリーズ番号を格納しない理由はありません。シリーズの一部ではないストーリーは、FKをシリーズの空白のままにしておくのと同じように、単に空白のままにすることができます。

+0

それは鍋ですが、それはモデルの中で最もクリーンではありません。今私は以下のことをしました。 'クラスSeriesPart(models.Model):' 'シリーズ= models.ForeignKey(シリーズ、on_delete = models.CASCADE') '物語= models.ForeignKey(ストーリー、on_delete = models.CASCADE') '配列= models.PositiveSmallIntegerField() ' – Chabu

関連する問題