Django 除了使用通用外键处理类似的模型树,还有其他方法吗?

Django 除了使用通用外键处理类似的模型树,还有其他方法吗?,django,django-models,foreign-keys,generic-foreign-key,Django,Django Models,Foreign Keys,Generic Foreign Key,我的场景:我正试图建立一个数据库来跟踪不同类型节目的制作进度。我已经用下面的模型结构描述了这一点 class Studio(models.Model): ... class Series(models.Model): studio = models.ForeignKey(Studio) ... class Season(models.Model): series = models.ForeignKey(Series) ... class Episode(mod

我的场景:我正试图建立一个数据库来跟踪不同类型节目的制作进度。我已经用下面的模型结构描述了这一点

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)
这里的问题是,
制作
工作室
对于电影和电视都是完全相同的(至少在这个场景中是这样),所以我不太愿意完全分开,因为这需要复制
制作
。一个用于电视,一个用于电影,唯一的区别是外键


在这里使用
GenericForeignKey
有意义吗?制作可以指向
插曲
电影
?我对此犹豫不决,因为听起来大家的共识是避免使用泛型外键,但我不知道还有什么办法可以做到。不久前,我遇到了类似的问题,我得出结论,使用两个外键和两个布尔变量通知这些表中的类型会更有效(以后也不会那么麻烦)

另外,从您的代码中,我看不到复制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)

您选择什么来标识foreignkey字段取决于您,但是布尔值在数据库中的大小很小。

这基本上就是我要发布的解决方案,尽管我想知道您是否需要布尔值。“电影不为空”的简单过滤器将提供相同的输出。谢谢!我想我会这样做,但是有一个
类型
字段。你有关于这方面的基准或相关数据吗?>我得出的结论是这样会更有效率