是否可以使用来自两个不同模型的属性的sorted()进行排序?

时间:2012-01-04 03:26:17

标签: python django sorting model

我正在尝试对投票优先于该日期的帖子列表进行排序。

我有自己的应用程序名为UserPost,我正在使用django投票应用程序进行投票。

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'))

最好的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

元组按字典顺序排序,因此如果你为sorted的key =参数返回一个元组,你可以按投票排序,然后按日期排序:

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

或者,您可能还想查看django Model的Meta类中的ordering选项或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))

答案 1 :(得分: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是比较帖子的功能。