2009-05-30 1 views
5

안녕하세요 장고에서 계산 된 값을 기준으로 개체를 정렬하고 싶습니다 ... 어떻게해야합니까?장고에서 계산 된 값을 기준으로 정렬하는 방법

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

    def get_reputation(): 
     ... 
     return reputation 
    reputation = property(get_reputation) 

그래서, 내가 명성하여 사용자를 정렬 할 말 : 여기

내 처지를 설명 스택 오버 플로우를 기반으로 예를 들어, 사용자 프로필 모델입니다. 어떻게해야합니까? 난 당신이 바로이 작업을 수행 할 수있어 :

Profile.objects.order_by("-reputation") 

감사합니다 당신의 도움이 모두가 당신의 계산 코드는 파이썬 내에 존재하기 때문에

답변

3

는 유일한 옵션은 save()를 오버라이드 (override) 업데이트 예를 들어 비정규 필드 (로 명성을 설정하는 것입니다 방법에 대한 모델).

+2

+1 : 단순히이 필드를 최신 상태로 유지하려면 save()를 재정의하십시오. –

+0

save()를 오버라이드하지 않고 사후 저장 신호를 사용하기로 결정했습니다.이 접근법에 대해 알아야 할 잠재적 인 문제가 있습니까? – Jiaaro

+0

신호를 사용하려면 post_save 대신 pre_save를 권합니다. post_save를 사용하여 비정규 화 된 필드를 최신 상태로 유지하려면 충분할 경우 두 번의 UPDATE 쿼리를 수행해야합니다. –

16

을 :)를 들어, 당신은뿐만 아니라 파이썬에서 정렬을 수행해야합니다

(당신이 기록을 많이 가지고 있고, 그 페이지를 매기는 예해야하기 때문에) 데이터베이스에서 정렬을 수행해야하는 경우
sorted (Profile.objects.all(), key = lambda p: p.reputation) 
+0

이 질문에 대한 답변입니다. 문제가 해결 되었기 때문에 다른 답변을 수락했습니다. 구체적으로 S.Lott의 의견입니다. 나는 당신의 대답을 upmodded :) – Jiaaro

+0

거기에 반환하는 방법은 queryset 대신 일반 파이썬 목록 (또는 쿼리 집합에 목록을 변환)? – Jiaaro

+0

코멘트에서 물어 보는 것이 조금 무거워 보입니다. 그래서 나는 그것을 자신의 질문으로 옮겼습니다 : http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset – Jiaaro

5

Django-1.8에서는 계산 된 값을 SQL로 렌더링 할 수있는 한 query expressions을 사용하여 QuerySet을 정렬 할 수 있습니다. 모델에 annotationsorder_by 용어로 사용할 수도 있습니다. +, -, *, /** 같은

from django.db.models import F 
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation") 

기본 조작은 F() 사용할 수 있습니다. 또한 여러 가지 다른 기능은 Count, Avg, Max로, ...가

링크 :

참조이 SO Q &A : Order a QuerySet by aggregate field value