繁体   English   中英

建筑物simlpe django firehose

[英]Building simlpe django firehose

我有一个应用程序,该应用程序要构建2-3种组合活动类型的“最近活动” / firehose提要,例如帖子,评论和帖子的喜欢,以及以后的更多内容。 我假设这是通过以下查询完成的:将添加到数据库中的适当对象的最后一个与其他类型的对象的最后一个合并,并按其时间戳对新合并的对象列表进行排序。 做这样的事情的最好方法是什么? 现在,每次有人刷新页面时,我都会遇到类似的情况:

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种方法即可。谢谢!

要合并列表,可以使用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)

但是,如您所见,仅使用一个键即可完成排序。 我不知道排序时使用两个不同键的任何方法。 您可以通过简单地在Comment类中添加一个名为postdate的属性(仅返回commentdate)来解决此问题 或者,甚至更好的是,您应该为所有模型使用相同的名称来创建时间,例如created_at

这已经在前面得到了解答,在此进行了更详细的介绍: 如何在Django视图中组合2个或更多查询集?

我真的不喜欢您的方法,因为当您要将另一个对象放在firehose上时,需要在所有需要显示该firehose的地方添加第三行( AnotherObject.objects.all ...等)!

对我而言,最好的方法是使用以下字段创建Firehose模型: dateaction (添加/删除/更新等)和object (已更改object的通用外键)。 现在,每当您要更改要添加到firehose的对象时,都将使用正确的字段值添加FirehoseClass的新实例。 最后,每当您要显示firehose时,您将只显示所有firehose对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM