2012-01-04 1 views
0

투표가 날짜보다 우선 순위가 높은 게시물 목록을 정렬하려고합니다.두 개의 다른 모델의 특성을 사용하여 sorted()를 사용하여 정렬 할 수 있습니까?

나는 내 자신의 응용 프로그램을 UserPost라고하며 투표를 위해 장고 투표 응용 프로그램을 사용하고 있습니다.

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

이것에 대해 갈 수있는 가장 좋은 방법은 무엇입니까?

감사합니다. 당신은 또한에 ordering 옵션을보고 할 수 있습니다,

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

을 다른 방법 :

+0

음, 검색어입니다. –

+0

빠른 팁 :'sorted' 내장 함수 대신'posts_list.sort (key = attrgetter ('datetime'))'를 사용해야합니다. 'sorted' 함수는리스트의 복사본을 생성합니다.리스트의'sort' 메소드는리스트를 적절한 위치에 정렬하고 약간 더 빠르며 (메모리의 약 절반을 사용합니다). – HardlyKnowEm

+0

@mlefavor : 100 만 개가 넘는 요소가있는 목록을 가지고 있지 않으면 분류가 병목 현상이 될 것입니다. 상황에 가장 잘 보이는 것을 사용하고 나중에 성능에 대해 걱정하십시오. –

답변

2

튜플은 당신이 날짜로 다음 표에 의해 정렬 할 수의 분류 키 = 인수에 튜플을 반환하므로 경우, 사전 식으로 분류되어 있습니다 django 모델의 Meta 클래스 또는 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

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'는 더 이상 사용되지 않습니다. –

관련 문제