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