2

我的场景:我正在尝试建立一个数据库来跟踪不同类型节目的制作时间表。我已经使用以下模型结构进行了映射。

class Studio(models.Model):
   ...

class Series(models.Model):
   studio = models.ForeignKey(Studio)
   ...

class Season(models.Model):
   series = models.ForeignKey(Series)
   ...

class Episode(models.Model):
   season = models.ForeignKey(Season)
   ...

class Production(models.Model):
   episode = models.ForeignKey(Episode)

但我现在也对跟踪电影的制作感兴趣。但这提出了一个挑战,因为电影没有与电视相同的树结构。像这样的东西会更合适:

class Studio(models.Model):
   ...

class Movie(models.Model):
   studio = models.ForeignKey(Studio)
   ...

class Production(models.Model):
   movie = models.ForeignKey(Movie)

这里的问题是电影ProductionStudio电视(至少在这种情况下)完全相同,所以我很犹豫是否拥有完全独立的树,因为这需要复制Production. 一个用于电视,一个用于电影,唯一的区别是外键。

在这里使用 a 有意义GenericForeignKey吗?一个产品可以指向一个EpisodeMovie?我对此犹豫不决,因为听起来共识是避免使用通用外键,但我不知道该怎么做。

4

1 回答 1

2

不久前我遇到了类似的问题,我得出的结论是,使用 2 个外键和 2 个布尔变量来通知这些表中的类型会更有效(以后麻烦也会更少)。

同样从您的代码中,我认为没有理由复制 Studio 模型,因为它是相同的,并且不包含唯一的外键字段。但是生产模型可以这样写

class Production(models.Model):
  movie = models.ForeignKey(Movie, null=True)
  episode = models.ForeignKey(Episode, null=True)
  is_movie = models.BooleanField(null=False)
  is_episode = models.BooleanField(null=False)

您选择什么来标识由您决定的外键字段,但 boolean 以其在数据库中的小尺寸而闻名。

于 2019-02-08T20:49:45.147 回答