문제

나는 장고의 ORM 주위에 머리를 잡는 데 어려움을 겪고 있습니다. 내가하고 싶은 것은 내 테이블의 필드 내에서 뚜렷한 값 목록을 얻는 것입니다 .... 다음 중 하나와 동일합니다.

SELECT DISTINCT myfieldname FROM mytable

(또는 대안 적으로)

SELECT myfieldname FROM mytable GROUP BY myfieldname

나는 원시 SQL에 의지하기 전에 적어도 Django 방식을하고 싶습니다. 예를 들어, 테이블과 함께 :

이드, 거리, 도시

1, 메인 스트리트, 헐

2, 다른 거리, 선체

3, Bibble Way, 레스터

4, 또 다른 방법, 레스터

5, High Street, Londidium

나는 얻고 싶다 :

헐, 레스터, 론디 디움.

도움이 되었습니까?

해결책

당신의 모델이 'Shop'이라고 말하십시오

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()

이것은 a ValuesListQuerySet 당신은 당신이 a에 캐스팅 할 수 있습니다 list. 추가 할 수도 있습니다 flat=True 에게 values_list 결과를 평평하게합니다.

또한보십시오: 필드별로 쿼리 세트의 뚜렷한 값을 얻습니다

다른 팁

여전히 매우 관련성이 높습니다 Jujule의 답변, 나는 또한 order_by() ~에 distinct("field_name") 쿼리. 그러나 이것은 Postgres 전용 기능입니다!

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

메모

필드 이름을 지정하면 쿼리 세트에 order_by ()를 제공해야하며 order_by ()의 필드는 동일한 순서로 고립 된 ()의 필드로 시작해야합니다.

예를 들어, select on on (a) 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 []
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top