Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 立即加载关系树_Python_Django_Django Queryset_Django Orm - Fatal编程技术网

Python 立即加载关系树

Python 立即加载关系树,python,django,django-queryset,django-orm,Python,Django,Django Queryset,Django Orm,我有一个叫Post的模型: class Post(models.Model): poster = models.ForeignKey(User) content = models.TextField(verbose_name='Text', max_length=1000) reply_to = models.ForeignKey('self', null=True, blank=True, default=None) 这允许添加“第一篇帖子”(带有空白回复),回

我有一个叫Post的模型:

class Post(models.Model):
    poster = models.ForeignKey(User)
    content = models.TextField(verbose_name='Text', max_length=1000)
    reply_to = models.ForeignKey('self', null=True, blank=True, default=None)   
这允许添加“第一篇帖子”(带有空白回复),回复帖子,甚至“回复回复”

例如,我的数据库中有这样的内容:

First Post
    Reply one
        Reply to reply one
    Reply two
        Reply to reply two
如何加载回复树

当我使用:

r = Post.objects.filter(reply_to=FirstPost)
它当然返回:

Reply one
Reply two
是否可以一次加载所有相关的帖子?
我需要它来统计第一篇文章的所有回复。

不,我不认为有办法一次加载所有回复

但是,您可以向post类型添加额外的元数据,以便能够运行按顺序样式的查询,在这种情况下,计算回复的数量变成了一个简单的计算,并且已经为父节点加载了数据

请参阅如何做到这一点(它使用MySQL方言和PHP,但原则仍然适用)


基本上,您可以向树中定义排序的节点添加
left
right
字段,这样您就可以轻松地计算树中给定根元素下的项数。它就像数据库表中的二叉树。原则取自这本优秀的数据库设计书:。

不,我不认为有办法一次加载所有回复

但是,您可以向post类型添加额外的元数据,以便能够运行按顺序样式的查询,在这种情况下,计算回复的数量变成了一个简单的计算,并且已经为父节点加载了数据

请参阅如何做到这一点(它使用MySQL方言和PHP,但原则仍然适用)

基本上,您可以向树中定义排序的节点添加
left
right
字段,这样您就可以轻松地计算树中给定根元素下的项数。它就像数据库表中的二叉树。原理取自这本优秀的数据库设计书:。

您可以使用MPTT()。我以前没有使用过这个库,所以请告诉我它是如何运行的

models.py views.py 您可以使用MPTT()。我以前没有使用过这个库,所以请告诉我它是如何运行的

models.py views.py
酷,这在一个简单的附加软件包中实现了我所提倡的。对,我以前使用过这个应用程序,@victor response达到了目标。看起来很棒!我很快就会试试。@Victor'Chris'Cabral我必须让你知道:MPTT工作得很好。我认为Django应该是默认的。顺便说一下,我需要的函数是get_substands(),而不是get_children()。无论如何,谢谢你。太棒了。我很高兴它工作得这么好。你的项目是开源的吗?或者你可以发布一些代码吗?很酷,这在一个简单的附加包中实现了我提倡的。对,我以前使用过这个应用程序,@victor response达到了目标。看起来很棒!我很快就会试试。@Victor'Chris'Cabral我必须让你知道:MPTT工作得很好。我认为Django应该是默认的。顺便说一下,我需要的函数是get_substands(),而不是get_children()。无论如何,谢谢你。太棒了。我很高兴它工作得这么好。你的项目是开源的吗?或者你能发布一些代码吗?
class Post(MPTTModel):
    poster = models.ForeignKey(User)
    content = models.TextField(verbose_name='Text', max_length=1000)
    parent = models.TreeForeignKey('self', null=True, blank=True, related_name='children')
    class MPTTMeta:
        order_insertion_by = ['poster']
 ....
 r = FirstPost.get_children()