2016-11-05 82 views
1

我目前有三種模式,但我不確定如何設計這個最好的。一個是Song模型,一個是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。這實現了你描述的情況,並且還假定Artist僅通過唱歌Song(他不能參與而不執行任何操作)參與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. Song-(M:O) - >藝術家
  3. 展示 - (O:M) - >歌曲
  4. 首樂曲(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