首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >建筑simlpe django消防喉

建筑simlpe django消防喉
EN

Stack Overflow用户
提问于 2015-07-13 06:02:58
回答 2查看 108关注 0票数 1

我有一个应用程序,我想要建立一个“最近的活动”/firehose提要的2-3组合类型的活动,如帖子,评论,喜欢帖子,以及其他东西+可能更晚。我假设这是通过查询将最后一个适当的对象添加到DB并将其与最后一个类型的对象组合起来,并根据它们的时间戳对新的组合对象列表进行排序。做这种事最好的方法是什么?现在,每当有人刷新页面时,我都会看到这样的内容:

代码语言:javascript
运行
复制
NewPost.objects.all().order_by('-postdate')[0:10] #takes the last 16 recently added posts
Comment.objects.all().order_by('-commentdate')[0:10] #takes equal number of comments site wide ordered by timestamp

那么,采取这两个查询集并在按时间戳排序的1个列表中呈现不同模型的最佳方法是什么?我假设添加其他类型的对象的逻辑类型是相同的,所以我只想知道如何用2来完成它。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-13 06:24:03

我不太喜欢你的方法,因为当你想在消防水管上放另一个物体时,你需要增加第三行(AnotherObject.objects.all .(等等)所有的地方,你需要展示消防软管!

对我来说,最好的方法是创建一个Firehose模型,其字段包括:dateaction (添加/删除/更新等)和object (被更改对象的通用外键)。现在,每当您对要添加到消防水管的对象进行更改时,就会添加一个具有正确字段值的FirehoseClass的新实例。最后,每当您想要显示消防软管时,您只需显示所有消防软管对象。

票数 1
EN

Stack Overflow用户

发布于 2015-07-13 06:20:52

要组合这些列表,可以使用itertools中的chain()创建一个列表,然后使用sorted()对它们进行排序。

代码语言:javascript
运行
复制
from itertools import chain
combined_lists = list(chain(new_post_list, comment_list))
sorted_combinened_list = sorted(combined_list, key=lambda instance: instance.postdate)

但是,正如您所看到的,排序只能使用一个键完成。我不知道有什么方法在排序时使用两个不同的键。您可以通过简单地向注释类添加一个属性来解决这个问题,这个类名为postdate,只需返回注释日期。或者,更好的是,您应该为所有模型使用相同的名称来创建时间,例如created_at。

这一点在前面已经得到了回答,在这里有更详细的说明:How to combine 2 or more querysets in a Django view?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31376328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档