1

我有 2 个这样的 django 模型

class Thread(models.Model):

    title = models.CharField(max_length=255, blank=True)

class Post(models.Model):

    message = models.TextField(blank=True)
    thread = models.ForeignKey(Thread, related_name='posts')
    depth = models.PositiveIntegerField(default=0)
    reply_to = models.ForeignKey('self', null=True, related_name='replies',
            blank=True)

我注意到当我这样做时

roots = Thread.posts.filter(depth=0)
for post in roots:
   replies = post.replies

django 执行查询以获取所有根,然后执行新查询以获取特定帖子的子项,我知道我将处理特定线程中的所有帖子。

我想知道是否有一种方法可以让 django 通过一个查询加载所有帖子,我还可以使用模型的关系递归地获取所有子项。

4

2 回答 2

1

它不是 django 内置的,但您可以为此使用 treebeard 或 django-mptt 等应用程序。

https://tabo.pe/projects/django-treebeard/

https://github.com/django-mptt/django-mptt

于 2013-08-26T12:49:56.443 回答
0

如果您只想获取与特定线程相关的所有帖子,那么您可以执行以下操作:

posts = Post.objects.filter(thread=thethread)

其中 'thethread' 是您感兴趣的 Thread 对象。在 reply_to 和 depth 上对其进行排序也可能很有用,以便它以易于以正确顺序遍历树的顺序返回:

posts = Post.objects.filter(thread=thethread).order_by('reply_to', 'depth')

tuxacanfly 对 django-treebeard 和 django-mptt 的建议对于在 SQL 中处理分层数据时减少数据库查询很有用,如果您需要更大的灵活性,然后只返回特定线程的所有帖子,这将是一个不错的选择。

从数据结构来看,您正在为论坛或评论系统执行此操作 - 关于此的一篇好文章是http://www.sqlteam.com/article/sql-for-threaded-discussion-forums,它有一个 django在https://github.com/danirus/django-comments-xtd实施

于 2013-12-23T08:29:28.040 回答