如何通过父条目和所有子条目获取(如果可能)查询集顺序等等?

时间:2011-05-20 04:06:48

标签: django

我不知道我是否在标题中以正确的方式描述事情,所以我会尝试在这里做得更好,

让我们说我正在构建一个论坛系统,并且我有一个Post模型,除了其他字段之外,还有一个Thread模型的外键和一个自我的外键,所以名字为parent_post,所以人们会能够发布对其他帖子的回复或为每个帖子开始新帖子。

每件事都很有效。我不知道也找不到的是当我想要显示一个帖子的所有帖子时如何按顺序显示帖子....

例如:

Thread x:

post a .....
       response to post a .....
       response number 2 to post a .....
post b ....
post c ....
       response to post c .....
       response 2 to post c .....

依旧......

我知道如何在纯SQL中做到这一点我也知道我可以返回所有帖子帖子并按顺序设置它们但是必须有一种方法用django方式: - )

谢谢你, 埃雷兹

3 个答案:

答案 0 :(得分:1)

您必须在帖子模型中设置ordering = ['id',]ordering = ['timestamp',]

当您要求posts = Post.models.filter(thread=x)时,所有帖子都会按'id''timestamp'字段排序。当你做posts[a].response_set.all()时,你将得到所有按照你在Meta课程中的设置订购的回复。

PS:抱歉我的英文

答案 1 :(得分:1)

我想你的模型看起来像是:

class Post(Model):
    ....
    thread = ForeignKey(Thread)
    post = ForeignKey('self')
    posttime = DateTimeField(auto_now_add=True)

你会得到所有母亲帖子属于一个帖子......

mothers = Post.objects.filter(thread=x, post__isnull=True)

post__isnull = True 会过滤对自己没有依据的帖子,这意味着它们是启动主题的帖子......

然后获取帖子属于一个主题并订购它们......

mother-post = mothers[0]
childs = Post.objects.filter(post=mother-post).order_by('posttime')

但可能,按ID排序(这是默认设置)也可以解决您的问题,因此您可能不需要 order_by

更新:

是的,您可以在一个查询中执行此操作,例如对于id = 12323的帖子,

Posts.objects.filter(Q(pk=12323) | Q(post__id=12323))

Link for documentation ......这将满足您的需求。

答案 2 :(得分:0)