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