2010-04-03 5 views
1

없음 특별 대우 :장고 ORM : 주문 집계 함수/w -이 쿼리하고있어

SomeObject.objects.annotate(something=Avg('something')).order_by(something).all() 

나는 일반적으로 내가 동기화 유지하기 위해 장고 신호를 사용하여 내 모델의 집계 필드가를, 그러나 이 경우 perfomance는 문제가 아니므로 간단하게 유지하고 하위 쿼리 만 사용한다고 생각했습니다.

그러나이 방법을 사용하면 예기치 않은 문제가 발생합니다. 일부 None 년대에 혼합 할 경우

[5.0, 4.0, 6.0 … (etc, just numbers)] 

그러나이 같은 주문보다 :

[None, 5.0, 4.0 …] 

문제가 없음이 더 높은 가치가없는 것으로 집계 함수의 결과가 같은 경우 그것은 모든 위대한 작품 0보다 큰 값을 가져야합니다.

저는 PostgreSQL을 사용 중이며 다른 DB를 테스트하지 않았습니다. 단지 그것을 할 수있는 방법이 있는지

sorted(…, key=lambda _:_.avg_rating if _.avg_rating is not None else 0) 

그래서 난 그냥 궁금 : 사실 난 그냥 메모리에 정렬하여 주위 근무 등

생성 어떤 쿼리를 확인하지 않은 장고 ORM? 아마도 .where일까요? 또는 다른 것?

답변

2

그냥 여분의()를 통해 has_something = 1,0을 추가 한 다음 has_something과 무언가를 모두 주문하는 방법은 무엇입니까?

with_avg = SomeObject.objects.annotate(avg=Avg('something')) 
with_avg_and_has = with_avg.extra(select={'has_something': 'something is NULL'}) 
sorted_result = with_avg_and_has.order_by('-has_something', '-avg').all() 

엄격한 의미에서 100 % ORM이 아니지만 정렬을 다시 DB로 푸시합니다.