我的场景:我正在尝试建立一个数据库来跟踪不同类型节目的制作计划。我已经用下面的模型结构映射出来了。
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)
这里的问题是电影和电视的Production
和Studio
完全相同(至少在这种情况下(,所以我对拥有完全独立的树犹豫不决,因为这需要复制Production
。一个用于电视,一个用于电影,唯一的区别是外键。
在这里使用GenericForeignKey
有意义吗?作品可以指向Episode
或Movie
的地方?我犹豫要不要这样做,因为听起来共识是避免使用通用外键,但我不确定该怎么做。
前我遇到了类似的问题,我得出的结论是,使用 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)
您选择什么来标识外键字段取决于您,但布尔值以其在数据库中的小尺寸而闻名。