2016-05-03 10 views
2

まず最初に、私はこのコーディングには全く新しいことを認めなければなりませんが、適切な解決策を見つけることができず、コードを学ぶことがおそらく最良の方法です。Django - 適合する中間m2mモデルを構築するにはどうすればいいですか? /ベストプラクティス

とにかく、私は別のタイトル所有者、選手権とそのようなものを表示するためのアプリを構築しようとしています。 Djangoのドキュメントを読んだ後、私は中間モデルをより良い方法として使う必要があることを理解しました。私の古いmodels.pyは、次のようになります。

class Person(models.Model): 
    first_name = models.CharField(max_length=64) 
    last_name = models.CharField(max_length=64) 
    [...] 

class Team(models.Model): 
    name = models.CharField(max_length=64) 
    team_member_one = models.ForeignKey(Person) 
    team_member_two = models.ForeignKey(Person) 

class Championship(models.Model): 
    name = models.CharField(max_length=128) 
    status = models.BooleanField(default=True) 

class Titleholder(models.Model): 
    championship = models.ForeignKey(Championship) 
    date_won = models.DateField(null=True,blank=True) 
    date_lost = models.DateField(null=True,blank=True) 
    titleholder_one = models.ForeignKey(Person,related_name='titleholder_one',null=True,blank=True) 
    titleholder_two = models.ForeignKey(Person,related_name='titleholder_two',null=True,blank=True) 

選手権応じて、いずれかの個人またはチームが優勝することができ、それはシングルまたはチーム優勝だ場合、私は覇者クラスの外部キーに持っていた理由です。 Django documentationを見ると、これは間違っているようです。一方、初心者の私にとって、この例の中間モデルは、私のモデルにはまったく適合していないようです。

短いストーリー:モデルを正しい方法で構築する方法について、誰でも正しい方向に向けることができますか?注:これは単にモデルを構築してDjangoの管理者に表示する方法に関する単なる質問に過ぎませんが、今のところテンプレートを構築することについては言及していません。

大変お手伝いいたします。先輩に感謝します。

+1

Djangoの 'ManyToManyField'は、中間テーブルを自動的に作成してクエリするための文法的な砂糖です。テーブルを明示的に作成した場合は、ここで並べ替えが行われているので、フィールドは必要ありません(まだ役立ちますが)。しかし、あなたが提示したスキーマにはいくつかの問題があります。誰もDjangoとは関係がありません.SQLデータベースのモデリングの問題です。もっと一般的な質問をすることをお勧めします(*私はこのデータをどうやってモデル化できますか?*)。 –

答えて

0

だから私はそれを最初から取り上げるでしょう。あなたはE-Rデータベースモデリングのやや新しいようです。あなたがしていることをやろうとしていたら、私は次のようにモデルを作りました。

最初に、チームは私の「コーナー」モデルでした(この言葉はFKフィールドを持たないモデルを意味するために使用します)。そして、Personモデルは次のように演奏されます。

class Team(models.Model): 
    name = models.CharField(max_length=64) 

class Person(models.Model): 
    first_name = models.CharField(max_length=64) 
    last_name = models.CharField(max_length=64) 
    team = models.ForeignKey(to=Team, null=True, blank=True, related_name='members') 

これは効果的なモデルは、スケーラブルになり、そしてあなたがチームに2人以上を持っているつもりはありませんされている場合でも、これは良い習慣です。

次はチャンピオンシップモデルです。私はこのモデルをPersonモデルと直接に、以下のような「スルー」モデルとの多対多の関係として接続します。

class Championship(models.Model): 
    name = models.CharField(max_length=64) 
    status = models.BooleanField(default=False) # This is not a great name for a field. I think should be more meaningful. 
    winners = models.ManyToManyField(to=Person, related_name='championships', through='Title') 

class Title(models.Model): 
    championship = models.ForeignKey(to=Championship, related_name='titles') 
    winner = models.ForeignKey(to=Person, related_name='titles') 
    date = models.DateField(null=True, blank=True) 

これは、私が理解したことに基づいて、これを実行した方法です。私はあなたがしようとしていることすべてを理解していないと確信しています。私の理解が変化するにつれて、私のニーズに合わせてこれらのモデルを修正するかもしれません。

また、GenericForeignKeyフィールドを使用して、TeamモデルまたはPersonモデルのFKになるフィールドを作成する方法もあります。変更することができる別のものは、チャンピオンシップが開催されるたびに詳細を保持する別のモデルを追加することです。それについては多くの方法があり、正しい方法はありません。

ご質問やご不明な点がありましたら教えてください。私は、必要に応じて答えを試して修正します。

関連する問題