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

标签 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(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。一种用于电视,一种用于电影,唯一的区别是外键。

在这里使用 GenericForeignKey 有意义吗?制作可以指向 EpisodeMovie 的地方?我犹豫是否要这样做,因为听起来共识是要避免使用通用外键,但我不确定还有什么办法可以这样做。

最佳答案

我前段时间遇到过类似的问题,我得出的结论是使用 2 个外键和 2 个 bool 变量通知这些表中的类型会更有效(并且以后的麻烦更少)。

另外,根据您的代码,我认为没有理由复制 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)

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

关于django - 除了使用通用外键来处理类似的模型树之外,还有其他方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599277/

相关文章:

mysql - Django 重置不删除表

python - (Django) 通过更新 UserProfile,图像无法正确保存

Django:如何让用户定义对象之间的语义关系?

sql - 如何在SQLAlchemy或SqlSoup ORM中自动反射(reflect)表关系?

django - FieldFile' 对象没有属性 'rfind'

python - 如何迭代对象的字段值?

mysql - 外键首选字符串还是整数?

mysql - 如何修复创建外部约束时的索引错误

django channels redis 多个消费者在不同的时间收到消息吗?

django - 如何在 Django 的同一页面上插入 2 个不同的表单