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

2024-04-27 08:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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中看到了一个似乎非常相关的示例,但它确实说明对象存储在不同的表中,我不确定这是否是这种设计的最佳选择

从绩效和良好实践的角度来看,什么是“正确”的方法


Tags: 对象django方法模型default定义modelspost
1条回答
网友
1楼 · 发布于 2024-04-27 08:16:02

这取决于你的定义

一个Thread和一个Post的区别是什么?一个Thread只是一个有回复的Post?或者Post必须属于Thread

对我来说,我会说一个Post可能是对另一个Post的回复,所以可能需要一个可空的reply_toFK('self')字段

这样,您就可以拥有一个带有许多回复的Post,从而创建一个线程,并且您可以允许回复回复(或者不回复,取决于您的用例)

对于存储视图计数等,您可以以某种时间序列的方式存储它(这样您就可以知道一篇文章随着时间的推移有多受欢迎,而不是一个整数,并且可以执行简单的计数操作来获取总视图)

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

有很多方法可以做到

相关问题 更多 >