your programing

Django에서 DISTINCT 개별 열을 선택 하시겠습니까?

lovepro 2020. 10. 6. 18:52
반응형

Django에서 DISTINCT 개별 열을 선택 하시겠습니까?


SELECT * FROM...아래에 " " 가 아닌 Django에서 쿼리를 수행하는 방법이 있는지 궁금합니다 . SELECT DISTINCT columnName FROM ...대신 " "을 (를) 하려고합니다 .

특히 다음과 같은 모델이 있습니다.

class ProductOrder(models.Model):
   Product  = models.CharField(max_length=20, promary_key=True)
   Category = models.CharField(max_length=30)
   Rank = models.IntegerField()

어디는 Rank내에서 순위입니다 Category. 해당 범주 내의 각 순위에서 일부 작업을 수행하는 모든 범주를 반복 할 수 있기를 바랍니다.

먼저 시스템의 모든 카테고리 목록을 가져온 다음 해당 카테고리의 모든 제품을 쿼리하고 모든 카테고리가 처리 될 때까지 반복하고 싶습니다.

차라리 원시 SQL을 피하고 싶지만 거기에 가야한다면 괜찮을 것입니다. 전에 Django / Python에서 원시 SQL을 코딩 한 적이 없지만.


데이터베이스에서 고유 한 열 이름 목록을 가져 오는 한 가지 방법 distinct()은와 함께 사용 하는 것입니다 values().

귀하의 경우 다음을 수행하여 구별 범주의 이름을 가져올 수 있습니다.

q = ProductOrder.objects.values('Category').distinct()
print q.query # See for yourself.

# The query would look something like
# SELECT DISTINCT "app_productorder"."category" FROM "app_productorder"

여기서 기억해야 할 몇 가지 사항이 있습니다. 첫째, 이것은 반환 ValuesQuerySet에서 다르게 작동하는가 QuerySet. say에 액세스하면 q(위) 의 첫 번째 요소가 의 인스턴스가 아닌 사전을 얻습니다 ProductOrder.

둘째, .NET Framework 사용에 대한 문서 경고 노트 를 읽는 것이 좋습니다 distinct(). 위의 예는 작동하지만 모든 조합 것 distinct()values()하지 않을 수 있습니다.

추신 : 모델의 필드에 소문자 이름 을 사용하는 것이 좋습니다 . 귀하의 경우 이것은 아래와 같이 모델을 다시 작성하는 것을 의미합니다.

class ProductOrder(models.Model):
    product  = models.CharField(max_length=20, primary_key=True)
    category = models.CharField(max_length=30)
    rank = models.IntegerField()

PostgreSQL을 사용하는 경우 실제로 매우 간단 합니다 distinct(columns).

Productorder.objects.all().distinct('category')

이 기능은 1.4 이후 Django에 포함되었습니다.


다른 답변은 괜찮지 만 Django에서 아무런 문제없이 DISTINCT 쿼리에서 얻을 수있는 값만 제공한다는 점에서 조금 더 깔끔합니다.

>>> set(ProductOrder.objects.values_list('category', flat=True))
{u'category1', u'category2', u'category3', u'category4'}

또는

>>> list(set(ProductOrder.objects.values_list('category', flat=True)))
[u'category1', u'category2', u'category3', u'category4']

그리고 PostgreSQL 없이도 작동합니다.

데이터베이스의 DISTINCT가 python보다 빠르다고 가정하고 .distinct ()를 사용하는 것보다 덜 효율적 set이지만 셸 주위를 노들 링하는 데는 좋습니다.


사용자는 해당 필드로 주문한 다음 구별합니다.

ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()

참고 URL : https://stackoverflow.com/questions/3852104/select-distinct-individual-columns-in-django

반응형