테이블 필드에서 고유 한 값 선택


104

Django의 ORM에 대해 고심하고 있습니다. 내가 원하는 것은 테이블의 필드 내에서 고유 한 값 목록을 가져 오는 것입니다. .... 다음 중 하나에 해당합니다.

SELECT DISTINCT myfieldname FROM mytable

(또는 대안으로)

SELECT myfieldname FROM mytable GROUP BY myfieldname

최소한 원시 SQL에 의존하기 전에 Django 방식으로 수행하고 싶습니다. 예를 들어, 테이블이있는 경우 :

id, 거리, 도시

1, 메인 스트리트, 헐

2, 다른 거리, 선체

3, Bibble Way, 레스터

4, 어나더 웨이, 레스터

5, High Street, Londidium

나는 얻고 싶다 :

헐, 레스터, 론디 디움.

답변:


202

모델이 '쇼핑'이라고 말하세요.

class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city')

당신이 가질 수 있기 때문에 Meta클래스의 ordering속성 세트를, 당신이 사용할 수있는 order_by()사용하는 경우 어떤 주문을 취소 매개 변수없이 distinct(). () 아래 문서를 참조하십시오.order_by

질의에 어떤 순서도 적용하지 않고 기본 순서도 적용하지 않으려면 매개 변수없이 order_by ()를 호출합니다.

그리고 주문 distinct()과 함께 사용 distinct()과 관련된 문제를 논의하는 메모에서 .

DB를 쿼리하려면 다음을 호출하면됩니다.

models.Shop.objects.order_by().values('city').distinct()

사전을 반환합니다.

또는

models.Shop.objects.order_by().values_list('city').distinct()

이것은 ValuesListQuerySet당신이 list. 당신은 또한 추가 할 수 있습니다 flat=True하는 values_list결과를 평평하게.

참고 항목 : 필드별로 Queryset의 고유 값 가져 오기


29
실제로 작동합니다. 하나! 모든 모델에서 작동하지 못했습니다. 이상하게도 일부에서는 작동했지만 다른 것은 작동하지 않았습니다. 메타 주문이있는 사람들에게는 작동하지 않습니다. 따라서 먼저 쿼리 셋의 순서를 지워야합니다. models.Shop.objects.order_by (). values ​​( 'city'). distinct ()
alj

2
values_list실제로 목록을 반환하지 않는다는 점에 유의하는 것이 중요 합니다. 쿼리 셋과 같은 것을 반환합니다. values_list 호출 주위에 항상 list ()를 사용하는 것이 유용하다는 것을 알았습니다.
dheerosaur

8
values_list반복자 인 ValuesListQuerySet을 리턴합니다. 목록으로 캐스팅하는 것이 편리 할 수 ​​있지만 특히 대규모 데이터 세트의 경우 모든 행을 한 번에 평가해야하는 경우 성능이 저하 될 수 있습니다.
Peter Kilczuk

3
Meta: ordering = ()django orm과 objects.distinct()vs. 의 "특징"은 objects.ordering().distinct()우리에게 몇 시간의 혼란을 야기했습니다. 해당 제품에 소비자 안전 경고 스티커가 있어야합니다.) 향후 헤드 스크래칭을 방지하기 위해 메타 주문 속성 없음 정책을 도입 할 수 있습니다.
hobs

매개 변수없이 사용하여 Meta클래스 를 끄고 ordering문제를 해결할 수 있습니다 . 그것은 아래의 검색어 세트의 API 문서에서의 " 당신이 어떤 순서 쿼리, 심지어 기본 주문, 전화에 적용하지 않으려면 매개 변수없이. "distinctorder_by()order_by()order_by()
마크 Mikofski

11

여전히 매우 관련뿐만 아니라 jujule의 대답 , 나는 그것이 매우 중요 또한의 의미를 알고 있어야 찾을 수 order_by()에 대한 distinct("field_name")쿼리. 그러나 이것은 Postgres 전용 기능입니다!

Postgres를 사용 중이고 쿼리가 구별되어야하는 필드 이름을 정의하는 경우 order_by()동일한 시퀀스의 동일한 필드 이름 (또는 필드 이름)으로 시작해야합니다 (나중에 더 많은 필드가있을 수 있음).

노트

필드 이름을 지정할 때 QuerySet에 order_by ()를 제공해야하며 order_by ()의 필드는 동일한 순서로 distinct ()의 필드로 시작해야합니다.

예를 들어 SELECT DISTINCT ON (a)는 a 열의 각 값에 대한 첫 번째 행을 제공합니다. 주문을 지정하지 않으면 임의의 행이 표시됩니다.

예를 들어에서 상점을 알고있는 도시 목록을 추출하려면 jujule의 예를 다음과 같이 조정해야합니다.

# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')  

2

예를 들어 :

# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.