DRF & Django

[DRF] ORM 중복 제거

UnoCoding 2022. 3. 10. 16:26

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