2016-11-05 28 views
1

私は現在3つのモデルを持っていますが、これをどのように最高に設計するかはわかりません。一つはSongモデル、1はArtistであると私はわからなかった最終的ShowモデルDjango多対多の関係

class Artist(models.Model): 
    name = models.CharField(max_length=255) 
    label = models.CharField(max_length=255, null=True) 

    def __str__(self): 
     return self.name 

class Show(models.Model): 
    name = models.CharField(max_length=255) 

    def __str__(self): 
     return self.name 


class Song(models.Model): 
    title = models.CharField(max_length=255) 
    artist = models.ManyToManyField('Artist') 
    show = models.ManyToManyField('Show') 
    duration = models.FloatField() 

    def __str__(self): 
     return '%s - %s (%s)' % (self.title, [artist.name for artist in self.artist.all()], self.duration) 

のものが関係しているです。アーティストには曲がありますが、曲には複数のアーティストが参加することもできますし、ショーは複数の曲を持つことができます(またはいつも持っています)。 ManyToManyフィールドの正しいデザインは何でしょうか?

+0

私はあなたのモデル "ショー" は何を表しているんわかりません、どうか明らかにしてください。だから、あなたはすべてのショーのパフォーマンスごとに "ソング"を複製するつもりですか?それは賢明に見えません。 ShowPerformanceのような、曲とショーをリンクするモデルを使用することをお勧めします。 –

答えて

1

データベースレベルでは、それはかなり明白です:Artist (M:N) Song (M:N) Show。これは、あなたが記述した状況を実装し、(彼は何かを実行せずに参加することはできません)を歌いながら、がShowに参加していることを前提としています。

モデルは、おそらくこのようになります。このため

class Artist(models.Model): 
    songs = models.ManyToManyField('Song') 

class Song(models.Model): 
    artists = models.ManyToManyField('Artist') 
    shows = models.ManyToManyField('Show') 

class Show(models.Model): 
    songs = models.ManyToManyField('Song') 
0

各個人が自分のモデル - で

関係

    、私によると、これはあなたを助ける、異なる見解を持つことができます
  1. アーティスト - (O:M) - >歌
  2. 歌 - (M:O) - >アーティスト
  3. SHOW-(O:M) - >曲
  4. Song-(M:M) - >

を表示:

class Artist(models.Model): 
    name = models.CharField(max_length=255) 
    label = models.CharField(max_length=255, null=True) 

    def __str__(self): 
     return self.name 


class Song(models.Model): 
    title = models.CharField(max_length=255) 
    artist = models.ManyToManyField('Artist') 
    duration = models.FloatField() 

    def __str__(self): 
     return self.title 


class Show(models.Model): 
    name = models.CharField(max_length=255) 
    song = models.ManyToManyField('Song') 

    def __str__(self): 
     return self.name