Django有很多关系

时间:2016-11-05 19:27:33

标签: django database-design django-models

我目前有三个型号,但我不确定如何设计这个最佳。一个是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字段的正确设计是什么?

2 个答案:

答案 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)

为此,每个人都可以有不同的观点,据我说这会对你有帮助,

模型中的关系 -

  1. 艺术家 - (O:M) - >歌曲
  2. Song-(M:O) - >艺术家
  3. 显示 - (O:M) - >歌曲
  4. 歌曲 - (M:M) - >显示
  5. 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