Python 密切相关对象的Django模型继承
我不确定定义两个密切相关、基于层次结构的对象之间关系的“正确”方法 我正在Django中开发一种类似论坛的框架 我最初的想法是,既然线程基本上是一种“特殊”的帖子,我应该创建一个功能齐全的帖子模型,然后从中继承一个线程模型,并用线程可能需要的任何字段进行扩展。像这样:Python 密切相关对象的Django模型继承,python,django,relationship,Python,Django,Relationship,我不确定定义两个密切相关、基于层次结构的对象之间关系的“正确”方法 我正在Django中开发一种类似论坛的框架 我最初的想法是,既然线程基本上是一种“特殊”的帖子,我应该创建一个功能齐全的帖子模型,然后从中继承一个线程模型,并用线程可能需要的任何字段进行扩展。像这样: class Post(models.Model): forum = models.ForeignKey(Forum) title = models.CharField(max_length=50, default
class Post(models.Model):
forum = models.ForeignKey(Forum)
title = models.CharField(max_length=50, default="")
text = models.CharField(max_length=2000, default="")
created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User)
class Thread(Post):
thread_views = models.IntegerField()
reply_count = models.IntegerField()
(...)
我还考虑过用一个“isThread”布尔字段创建一个“Post”模型,但感觉有些不对劲
我在示例中看到了一个似乎非常相关的示例,但它确实说明对象存储在单独的表中,我不确定这是否是这种设计的最佳选择
从性能角度和良好实践角度来看,“正确”的方法是什么?这取决于您的定义
线程
和帖子
之间的区别是什么?线程仅仅是带有回复的帖子?或者帖子
必须属于线程
对我来说,Post
可能是对另一篇Post
的回复,因此可能需要一个可为空的reply\u to
FK('self')
字段
这样,您就可以拥有一个包含多个回复的Post
,从而创建一个线程,并且您可以允许回复回复(或者不回复,取决于您的用例)
对于存储视图计数等,您可以以某种时间序列的方式存储它(这样您就可以知道一篇文章随着时间的推移有多受欢迎,而不是一个整数,并且能够执行简单的计数操作来获取总视图,例如)
有很多方法可以做到 这取决于你的定义
线程
和帖子
之间的区别是什么?
线程仅仅是带有回复的帖子?或者帖子
必须属于线程
对我来说,Post
可能是对另一篇Post
的回复,因此可能需要一个可为空的reply\u to
FK('self')
字段
这样,您就可以拥有一个包含多个回复的Post
,从而创建一个线程,并且您可以允许回复回复(或者不回复,取决于您的用例)
对于存储视图计数等,您可以以某种时间序列的方式存储它(这样您就可以知道一篇文章随着时间的推移有多受欢迎,而不是一个整数,并且能够执行简单的计数操作来获取总视图,例如)
有很多方法可以做到 这取决于您是否要在数据库中实际保存Post
对象。如果您同时拥有帖子
和线程
,那么您做的事情是正确的。如果没有,并且您认为将来可能会有其他类型的帖子,那么您可能希望将Post
作为一个需要子类化的帖子。使用类似于is\u-thread
的方法不是最佳的,因为这意味着特定的thread
字段必须是可选的,并且您需要编写所有验证,而不是依赖于模型验证。这取决于您是否要在数据库中实际保存Post
对象。如果您同时拥有帖子
和线程
,那么您做的事情是正确的。如果没有,并且您认为将来可能会有其他类型的帖子,那么您可能希望将Post
作为一个需要子类化的帖子。使用类似于is\u-thread
的方法不是最佳的,因为这意味着特定的thread
字段必须是可选的,您需要编写所有验证,而不是依赖于模型验证。您是对的,我应该更具体一些。一个线程
实际上只是一个带有回复的帖子。一篇Post
可以是对另一篇Post
的回复,只要Post
都属于同一线程
。在这种情况下,线程
和Post
之间没有真正的公共字段,你应该有两个单独的模型类,并且Post
和线程
之间有一个FK关系。你是对的,我应该更具体一些。一个线程
实际上只是一个带有回复的帖子。一篇Post
可以是对另一篇Post
的回复,只要Post
都属于同一个线程
。在这种情况下,线程
和Post
之间没有真正的公共字段,您应该在Post
和线程
之间有两个单独的模型类和FK关系
class PostActions:
post (link to Post)
action ('view', 'like', 'click' etc)
timestamp (auto_now)