我目前有三个型号,但我不确定如何设计这个最佳。一个是Song
模型,一个是Artist
,最后是Show
模型
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 :(得分:1)
在数据库级别,它非常明显:Artist (M:N) Song (M:N) Show
。这会实现您描述的情况,并假设Artist
仅通过唱Show
来参与Song
(他不能在没有表演的情况下参加)。
模型可能会是这样的:
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')
答案 1 :(得分:0)
为此,每个人都可以有不同的观点,据我说这会对你有帮助,
模型中的关系 -
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