Django에는 QuerySet의 filter에 order by와 같은 메소드인 distinct가 있습니다.
distinct는 SQL에 있듯이 의미 하는 바는 "중복제거" 입니다.
Distinct를 단독으로 사용 방법
Vehicle.objects.distinct()
↑코드의 SQL 쿼리
print(Vehicle.objects.distinct().query)
SELECT DISTINCT "myapp_vehicle"."id", "myapp_vehicle"."name", "myapp_vehicle"."number" FROM "myapp_vehicle"
쿼리의 결과 ↓
<QuerySet [<TestManager: TestManager object (354)>, <TestManager: TestManager object (355)>, <TestManager: TestManager object (356)>, <TestManager: TestManager object (357)>, <TestManager: TestManager object (358)>, <TestManager: TestManager object (359)>, <TestManager: TestManager object (360)>, <TestManager: TestManager object (361)>, <TestManager: TestManager object (362)>, <TestManager: TestManager object (363)>, <TestManager: TestManager object (364)>, <TestManager: TestManager object (365)>, <TestManager: TestManager object (366)>,
<TestManager: TestManager object (403)>, <TestManager: TestManager object (456)>, <TestManager: TestManager object (457)>, <TestManager: TestManager object (458)>, <TestManager: TestManager object (459)>, <TestManager: TestManager object (460)>, <TestManager: TestManager
object (461)>, '...(remaining elements truncated)...']>
모든 필드의 DISTINCT의 조건으로 했을 경우, 중복되는 레코드는 없다는 의미입니다.
Distinct와 values_list를 결합
하나일 때
Vehicle.objects.distinct().values_list('name')
↑코드의 SQL 쿼리
print(Vehicle.objects.distinct().values_list('name').query)
SELECT DISTINCT "myapp_vehicle" . "name" FROM "myapp_vehicle"
두개 이상일 때
Vehicle.objects.distinct().values_list('name','number')
↑코드의 SQL 쿼리
print(Vehicle.objects.distinct().values_list('name','number').query)
SELECT DISTINCT "myapp_vehicle" . "name", "myapp_vehicle" . "number" FROM "myapp_vehicle"
쿼리의 결과 ↓
<QuerySet [('아반때', '14마 1234'), ('소나타', '14마 1236'), ('투싼', '14마 1235')]>
Distinct와 및 order_by
distinct()와 order_by()조합할 때는 주의가 필요합니다
order_by()에 지정한 필드가 DISTINCT에 추가됩니다
Vehicle.objects.order_by('id').distinct().values_list('name')
↑코드의 SQL 쿼리
print(Vehicle.objects.order_by('id').distinct().values_list('name').query)
SELECT DISTINCT "myapp_vehicle" . "name", "myapp_vehicle" . "id" FROM "myapp_vehicle"
보시는거와 같이 id가 DISTINCT에 포함되었기 때문에 다 나오는 모습!!
<QuerySet [<TestManager: TestManager object (354)>, <TestManager: TestManager object (355)>, <TestManager: TestManager object (356)>, <TestManager: TestManager object (357)>, <TestManager: TestManager object (358)>, <TestManager: TestManager object (359)>, <TestManager: TestManager object (360)>, <TestManager: TestManager object (361)>, <TestManager: TestManager object (362)>, <TestManager: TestManager object (363)>, <TestManager: TestManager object (364)>, <TestManager: TestManager object (365)>, <TestManager: TestManager object (366)>,
<TestManager: TestManager object (403)>, <TestManager: TestManager object (456)>, <TestManager: TestManager object (457)>, <TestManager: TestManager object (458)>, <TestManager: TestManager object (459)>, <TestManager: TestManager object (460)>, <TestManager: TestManager
object (461)>, '...(remaining elements truncated)...']>
결론: 3개중 상황에 따라 골라 사용
'DRF & Django' 카테고리의 다른 글
[Django] Django에서 쓰이는 Context Manager (0) | 2023.01.31 |
---|---|
[DRF] Serializers 개념 (0) | 2022.08.08 |
[DRF] Redis vs RabbitMQ and setting (0) | 2022.02.03 |
[DRF] Redis, Celery 기본 세팅 (1) | 2022.02.01 |