2012-06-01 6 views
38

나는 별개의 외래 키의 목록을하려고 나는이 쓴 가져 오기 :장고 모델 - 서로 다른 값 목록

my_ids = Entity.objects.values('foreign_key').distinct() 

을하지만 UNDISTINCT 외래 키 단지 목록을 ... 내가 무엇을 놓치고를?

감사합니다.

답변

28

그게 전부입니다! 두 솔루션은 늘 100 % 작동 ...하지만 난 종류의 MySQL을 데이터베이스에 대한 별개의 나던 작업에 인수 (AFAIK)

이 하나가 작동 반환 한 개체를 전달 그들을 :

을 결합 :

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

그러나 어쨌든 감사합니다 :)

+4

Postgres9.1 데이터베이스에서 Django == 1.5.5와 동일한 문제가 있습니다. 추가 order_by 도움 - 바보 ... – kev

31

아마 당신이 갈 수도 있습니다 :

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct() 
+7

잘못. order_by ('foregin_key')없이 사용하면 효과가 없습니다. 예를 들어 M2M (postgres, django 1.8) – andi

3
Entity.objects.order_by('foreign_key').distinct('foreign_key') 

을 이미리스트로이 경우, 고유 값을 얻기 위해 set()로 변환.

+0

에서 set으로 변환 할 때 set()과 같이 메모리를 사용하면 값 비싼 아이디어가됩니다. 모든 것이 메모리에서 채워지는 곳입니다. 쿼리 세트가로드 될 때까지는로드되지 않고 .. 목록 것은 queryset도 평가할 것이다 ?? –

15
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by() 

에 의해 순서가 작동하지 별개

order_by() 호출에 사용 된 모든 필드는 SQL SELECT 열에 포함됩니다. distinct()와 함께 과 함께 사용하면 예기치 않은 결과가 발생할 수 있습니다. 관련 모델의 입력란을 기준으로 주문하면 해당 입력란이 선택한 열에 추가되고 일 경우 중복 행이 뚜렷하게 표시 될 수 있습니다. 여분의 열이 반환 된 결과에 나타나지 않으므로 ( 주문 만 지원), 때로는 이 아닌 뚜렷한 결과가 아닌 것으로 보입니다.

마찬가지로,이 값을 사용하는 경우() 쿼리 는 어떤 order_by에 사용되는 열() (또는 기본 모델 순서)가 여전히 포함됩니다 선택된 열을 제한하고 결과의 고유성에 영향을 미칠 수 있습니다.

여기 도덕적 인 점은 distinct 모델을 사용하는 경우 관련 모델에 따라 주문시주의해야합니다. 마찬가지로 distinct() 및 values ​​()를 함께 사용하는 경우 values ​​() 호출에없는 필드로 주문할 때는주의해야합니다.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

조금 더 정교한 주시겠습니까? 이 질문의 투표율을 감안할 때 이것은 많은 사람들에게 중요한 문제입니다.그 말을 당신의 근원은 무엇입니까? –

+0

나는 내 마음을 거의 잃어 버렸다. 이 솔루션을 가져 주셔서 감사합니다! – Crystal