Django模型继承用于密切相关的对象

时间:2017-08-17 15:15:01

标签: python django relationship

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

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

我最初的想法是,由于Thread基本上是一种“特殊”类型的Post,我应该创建一个功能齐全的Post模型,然后让一个Thread模型从它继承,扩展为Thread可能的任何字段需要。像这样:

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”模型,但是对它感觉不对。

我在Django docs中看到了一个看似非常相关的例子,但它确实说对象存储在不同的表中,我不确定这是否是这种设计的最佳选择

这样做的“正确”方法是什么,性能明智和良好做法明智?

1 个答案:

答案 0 :(得分:0)

这取决于您的定义。

ThreadPost之间的区别是Thread只有Post的回复?或者Post是否必须属于Thread

对我而言,我会说Post可以回复另一个Post,因此可能需要一个可以为reply_to FK('self')字段的空白。

通过这种方式,您可以拥有一个包含许多回复的Post,从而创建一个帖子,您可以允许回复回复(或不回复,具体取决于您的使用案例)。

为了存储视图计数等,你可以用某种时间序列方式存储它(这样你就可以知道帖子随着时间的推移有多受欢迎,而不是一个整数,以及能够做到例如,获取总视图的简单计数操作)

class PostActions:
    post (link to Post)
    action ('view', 'like', 'click' etc)
    timestamp (auto_now)

有很多方法可以做到!