【问题标题】:Is there an alternative to using generic foreign keys to handle similar model trees?是否有替代使用通用外键来处理类似模型树的方法?
【发布时间】:2019-07-03 02:25:21
【问题描述】:

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

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 对于电影和电视来说是完全相同的(至少在这种情况下),所以我很犹豫要完全独立的树,因为这需要复制 @987654325 @。一个用于电视,一个用于电影,唯一的区别是外键。

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

【问题讨论】:

    标签: django django-models foreign-keys generic-foreign-key


    【解决方案1】:

    不久前我遇到了类似的问题,我得出的结论是,使用 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 以其在数据库中的小尺寸而闻名。

    【讨论】:

    • 这基本上是我即将发布的解决方案,尽管我想知道您是否需要布尔值。 “电影不为空”的简单过滤器将提供相同的输出。
    • 谢谢!我想我会这样做,但要使用 type 字段。
    • 您有这方面的任何基准或相关数据吗? > 我得出的结论是它会更有效率
    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 2022-12-15
    • 2014-01-21
    • 1970-01-01
    • 2021-05-18
    • 2016-03-21
    • 2016-04-09
    • 2015-06-16
    相关资源
    最近更新 更多