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

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

나는 얻고 싶다 :

헐, 레스터, 론디 디움.



답변

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

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의 고유 값 가져 오기


답변

여전히 매우 관련뿐만 아니라 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')  


답변

예를 들어 :

# 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 []


답변