上下文
我正在使用Django模型对数据进行建模。主要型号是Article
。它保存了实际内容。
然后,每个Article
必须附加到一组文章。这些组可能是Blog
、Category
、Portfolio
或Story
。每个Article
必须连接到一个,而正是其中之一。也就是说,一个博客,一个类别,或者一个故事。这些模型有非常不同的领域和特点。
我想出了三种方法来达到这个目标(还有一种奖励--一种看起来确实不对的方法)。
选项1:通用外键
就像在django.contrib.contenttypes.fields.GenericForeignKey
一样。看起来是这样的:
class Category(Model):
# some fields
class Blog(Model):
# some fields
class Article(Model):
group_type = ForeignKey(ContentType)
group_id = PositiveIntegerField()
group = GenericForeignKey('group_type', 'group_id')
# some fields
在数据库方面,这意味着模型之间实际上不存在任何关系,它们由Django强制执行。
选项2:多表继承
使项目组全部继承自ArticleGroup
模型。这个应该是这样的:
class ArticleGroup(Model):
group_type = ForeignKey(ContentType)
class Category(ArticleGroup):
# some fields
class Blog(ArticleGroup):
# some fields
class Article(Model):
group = ForeignKey(ArticleGroup)
# some fields
在数据库端,这将为ArticleGroup
创建一个附加表,然后Category
和Blog
将该表的隐式外键作为其主键。
Sidenote:我知道有https://github.com/chrisglass/django_polymorphic可以自动化这些结构的簿记。
选项3:手动OneToOneFields
在数据库方面,它等同于选项2。但是在代码中,所有关系都是显式的:
class ArticleGroup(Model):
group_type = ForeignKey(ContentType)
class Category(Model):
id = OneToOneField(ArticleGroup, primary_key=True)
# some fields
class Blog(Model):
id = OneToOneField(ArticleGroup, primary_key=True)
# some fields
class Article(Model):
group = ForeignKey(ArticleGroup)
# some fields
我不太明白这有什么意义,除了明确Django的继承魔术的含义之外。
奖金:多色
它看起来很脏,所以我只是把它作为一个奖励,但它也可以定义一个可空的ForeignKey到每个Category
,Blog
,.直接在Article
模型上。
所以.
...I不能在这两者之间做出真正的决定。每种方法的优缺点是什么?有什么最佳做法吗?我错过了更好的方法吗?
如果这有关系,我使用Django 1.8。
发布于 2015-07-06 15:15:07
看来没人能在那件事上分享意见。我最终选择了多色选择,尽管我说过它看起来很难看。这一切归结为三件事:
选项#1
选项2
extra()
或自定义查询,但是在某些时候没有理由再使用ORM了。选项#3
多色门
select_related('category', 'blog', ...)
。Article
的表)并限制可能的类型数量,但我不太可能遇到这些问题。希望它能帮助那些同样进退两难的人,并且仍然有兴趣听取其他人的意见。
https://stackoverflow.com/questions/30562039
复制相似问题