Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 密切相关对象的Django模型继承_Python_Django_Relationship - Fatal编程技术网

Python 密切相关对象的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

我不确定定义两个密切相关、基于层次结构的对象之间关系的“正确”方法

我正在Django中开发一种类似论坛的框架

我最初的想法是,既然线程基本上是一种“特殊”的帖子,我应该创建一个功能齐全的帖子模型,然后从中继承一个线程模型,并用线程可能需要的任何字段进行扩展。像这样:

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)