Можно ли сортировать, используя sorted () с атрибутами из двух разных моделей? - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь отсортировать список сообщений, в которых голоса имеют приоритет над датой.

У меня есть собственное приложение под названием 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 ]

2 голосов
/ 04 января 2012

Кортежи отсортированы лексикографически, поэтому, если вы вернете кортеж для аргумента key = аргумент, вы можете отсортировать по голосам, а затем по датам:

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

В качестве альтернативы вы также можете посмотреть опцию ordering в мета-классе модели django или метод order_by в django Queryset. Они будут выполнять сортировку базы данных в одном запросе, поэтому могут быть намного быстрее. Кроме того, вы можете попробовать использовать 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 голосов
/ 04 января 2012

Вы можете отсортировать это так:

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 - функция, которая сравнивает ваши сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...