simlpe Django firehos大楼

2024-04-19 17:53:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,我想建立一个“最近的活动“/消防水龙带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

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


Tags: 对象方法应用程序类型列表byobjects排序
2条回答

我真的不喜欢你的方法,因为当你想把另一个物体放到消防水龙带上时,你需要添加第三行(AnotherObject.objects.all。。。等)到所有你需要展示消防水龙带的地方!你知道吗

对我来说,最好的方法是创建一个Firehose模型,其中包含如下字段:dateaction(add/delete/update等)和object(已更改对象的通用外键)。现在,无论何时对要添加到firehose的对象进行更改,都需要使用正确的字段值添加FirehoseClass的新实例。最后,无论何时要显示消防水龙带,都只需显示所有消防水龙带对象。你知道吗

要组合列表,可以使用创建列表,方法是使用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。或者,更好的是,您应该为所有模型的创建时间使用相同的名称,例如处创建。你知道吗

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

相关问题 更多 >