2010-03-13 5 views
3

나는 다음과 같은 뭔가를 찾고 있어요 : 존재하지 않는Django : Group by?

previous_invoices = Invoice.objects.filter(is_open=False) 
            .order_by('-created') 
            .group_by('user') 

하지만 group_by() ...

이 각 사용자에 대해 가장 최근에 닫은 송장을 찾아 낼 것입니다.

aggregation API은 계산 및 합계에 대해 이와 같은 작업을 수행하는 것처럼 보이지만 계산 또는 합계 등을 필요로하지 않습니다. 실제로 송장 개체를 원합니다.

+0

는 그룹별로 사용할 때 * 선택된 * 정의 된 것입니까? SQL 구현에 따라 다른 결과가 나올 것으로 예상됩니다 ... – user3012759

+0

@ user3012759 아니요. 순서는 그룹화 후에 발생하며, 그 그룹 내에서 돌아 오는 레코드는 정의되지 않습니다. 그 사실을 이해하기까지는 다소 시간이 걸렸습니다. ['ONLY_FULL_GROUP_BY'] (https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)는 실수로하지 않도록 기본 IMO에 의해 활성화되어야합니다. – mpen

+0

안녕하세요 @ mpen 최근에 답변을 추가했습니다. 보세요. –

답변

1

1 옵션하십시오 group_by() 비록

장고에 존재하지 않는, 당신은 시도뿐만 아니라 사용자의 latest() 방법과 필터를 활용하여 각 사용자에 대한 가장 최근에 닫은 송장을 검색에 해결할 수 있습니다 : 장고의 이전 버전

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False) 
            .latest('created') 

이었다 latest() 쿼리는 다음과 같이 것, 존재하지 않는 :

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False) 
            .order_by('-created')[0] 

옵션 2 : Django GROUP BY field value :

당신이 절대적으로 group_by의 효과를 만들려면을, 다음 하나 수동으로 여기 허용 대답에 표시를 만듭니다. (사전에 그들을 모르는 경우)

  1. flat=True에 사용 .values_list()는 데이터베이스에 존재하지 않는 값의 목록을 얻을 수 있습니다.이제 value_list을 반복하고 사전 입력

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True 
    ).distinct() 
    
  2. 을 :

    group_by_value = {} 
    for value in value_list: 
        group_by_value[value] = MyModel.objects.filter(interesting_field=value) 
    

이제 group_by_value 사전 키를 별개로 포함을 또한 우리는 사람들을 위해 걱정하지 않는 한 중복 값을 elimintae하는 .distinct()를 사용 interesting_field의 값이 이고 쿼리 세트 개체의 값으로 의 각 값은 MyModel이고입니다..


참고 : 확인 할 수 있습니다 장고에 group_by()를 추가하는 주장이 라이브러리 django-group-by이 존재

.

2

누가 장고에 해킹했는지는 this page from 2007이지만, 1.1 이전에는 문서화되지 않은 group_by`가 있으므로 어쨌든 부적절합니다. 그러나 this thread from a year ago에는 통찰력이있는 것으로 보입니다. 본질적으로 :

장고는 ORM 에 의도적으로 "GROUP BY"또는 그와 비슷한 것을 공개하지 않습니다. 관계형 저장소 백엔드 에 대한 의 가끔씩 누출되는 경우가 있지만 ORM API 은 SQL과 관련이 거의 없습니다. 대신, 우리는 가 "에 의해 GROUP"를 사용하여 구현 될 일이 기능의 특정 부분을 노출 는 는 SQL로 바뀌이다 (잘 는 다른 스토리지 시스템의 백엔드와 마법의 요정의 일부는 완전히 다른 세트에 의해 구현 될 수있을 때).

참조 또한이 extra를 사용하는 언급, 또한 마법의 방법이있는 것을이 실패 할 수 있습니다. 행운을 빌어 요.