2012-01-04 69 views
0

我在尝试对投票优先于日期的帖子进行排序。是否可以使用sorted()和来自两个不同模型的属性进行排序?

我有我自己的应用程序叫UserPost和我使用Django-voting app来做投票。

class UserPost(models.Model): 
    user = models.ForeignKey(User) 

    datetime = models.DateTimeField(auto_now_add=True) 
    text = models.CharField(max_length=255, blank=True) 
    is_deleted = models.BooleanField(default=False) 
    vote = models.ForeignKey(Vote) 

现在,我没有整理票采取优先次序尚未:

posts_list = sorted(posts_list, key=attrgetter('datetime')) 

什么是去了解它的最好方法?

谢谢!

+0

在查询中。 – 2012-01-04 03:27:57

+0

快速提示:您应该使用'posts_list.sort(key = attrgetter('datetime'))''而不是使用'sorted'内置函数。 'sorted'函数将创建列表的一个副本,而list的'sort'方法就地对列表进行排序并且速度稍快(并且使用大约一半的内存)。 – HardlyKnowEm 2012-01-04 03:42:15

+0

@mlefavor:我怀疑排序会成为一个瓶颈,除非你有超过一百万个元素的列表。使用最易于理解的情况,以后再担心表现。 – 2012-01-04 03:55:57

回答

2

元组字典顺序排序,因此,如果您返回一个元组排序的键=参数可以通过投票排序,然后按日期:

posts_list = sorted(posts_list, key=lambda post: (Vote.objects.get_score(post)['score'], post.datetime)) 

或者,你可能也想看看一个的ordering选项django Model的Meta类或者django Queryset上的order_by方法。他们会在一个查询中对数据库进行排序,因此速度会更快。或者,你可以尝试posts_list.get_score_in_bulk(),以减少查询的两个(一个用于posts_list,以及一个用于get_score_in_bulk)的数量,像这样:

scores = Vote.objects.get_score_in_bulk(posts_list) 
posts_list = sorted(posts_list, key=lambda post: (scores[post.id]['score'], post.datetime)) 
+0

谢谢,这真的很有帮助! – arooo 2012-01-04 12:54:22

0

可以这样排序的:

def posts_sorting(post1, post2): 
    # put here the way you compare posts 
    pass # return 1 if post2 before post1, -1 otherwise, 0 if they are "equal" 

posts_list = sorted(posts_list, cmp=posts_sorting) 

其中posts_sorting是比较你的帖子的函数。

+0

'cmp'已弃用。 – 2012-01-04 04:09:07

相关问题