我有一个应用程序,我想要建立一个“最近的活动”/firehose提要的2-3组合类型的活动,如帖子,评论,喜欢帖子,以及其他东西+可能更晚。我假设这是通过查询将最后一个适当的对象添加到DB并将其与最后一个类型的对象组合起来,并根据它们的时间戳对新的组合对象列表进行排序。做这种事最好的方法是什么?现在,每当有人刷新页面时,我都会看到这样的内容:
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来完成它。谢谢!
发布于 2015-07-13 06:24:03
我不太喜欢你的方法,因为当你想在消防水管上放另一个物体时,你需要增加第三行(AnotherObject.objects.all
.(等等)所有的地方,你需要展示消防软管!
对我来说,最好的方法是创建一个Firehose
模型,其字段包括:date
、action
(添加/删除/更新等)和object
(被更改对象的通用外键)。现在,每当您对要添加到消防水管的对象进行更改时,就会添加一个具有正确字段值的FirehoseClass的新实例。最后,每当您想要显示消防软管时,您只需显示所有消防软管对象。
发布于 2015-07-13 06:20:52
要组合这些列表,可以使用itertools中的chain()创建一个列表,然后使用sorted()对它们进行排序。
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?
https://stackoverflow.com/questions/31376328
复制相似问题