QuerySet

  • DB에서 전달받은 객체들의 모음 (list)
  • Python으로 작성한 코드가 SQL로 mapping되어 QuerySet 자료형으로 넘어옴
  • Django에서는 속성이 column, 속성에 부여된 이 row 임 -> dictionary 형태

.objects.all()

  • QuerySet 타입
  • 테이블에 있는 모든 데이터 조회
  • <QuerySet [<Class: values>, ]


Post 테이블

스크린샷 2023-11-14 오후 4 31 04

Post.objects.all()
<QuerySet [<Post: Local key-value 스토리지가 고민일땐 RocksDB 어때?,네이버,2023-11-07 00:00:00+00:00,1,0>, <Post: AI 경량화: 더 빠르고 저렴한 AI 서비스,네이버,2023-10-31 00:00:00+00:00,0,0>, <Post: Kafka에서 파티션 증가 없이 동시 처리량을 늘리는 방법 - Parallel Consumer,네이버,2023-10-24 00:00:00+00:00,0,0>, <Post: AOP in TypeScript,네이버,2023-10-17 00:00:00+00:00,0,0>, <Post: flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기,네이버,2023-09-22 00:00:00+00:00,0,0>, <Post: 시니어 개발자가 대화형 인공지능(ChatGPT)과 페어 프로그래밍하는 법(feat. DEVIEW 2023 코드 구현하기),네이버,2023-09-11 00:00:00+00:00,1,0>, <Post: flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기,네이버,2023-08-29 00:00:00+00:00,0,0>, <Post: "나는 네이버 프런트엔드 개발자입니다" 출간 여정기,네이버,2023-08-25 00:00:00+00:00,0,0>, ...]>


  • indexing으로 객체 불러올 수 있음
a = Post.objects.all()[0]

a
# <Post: Local key-value 스토리지가 고민일땐 RocksDB 어때?,네이버,2023-11-07 00:00:00+00:00,1,0>

a.id
# 1

a.title
# 'Local key-value 스토리지가 고민일땐 RocksDB 어때?'

print(type(a))
# <class 'techs.models.Post'>

.objects.get()

  • 객체 타입
    • dot donation으로 접근 가능
  • 하나의 row만 조회
    • 결과가 1건 이상일 경우 에러 발생
  • 주로 pk 컬럼으로 조회
Post.objects.get(id=1)
Post.objects.get(pk=1)
<Post: Local key-value 스토리지가 고민일땐 RocksDB 어때?,네이버,2023-11-07 00:00:00+00:00,1,0>


  • 옵션으로 가져올 수도 있음
  • 그러나, 옵션의 결과값이 항상 1개이어야 함!
Post.objects.get(title__startswith="TensorFlow")

.objects.filter()

  • QuerySet 타입
  • 특정 조건에 맞는 row만 조회
  • AND &, or | 옵션 사용 가능
Post.objects.filter(title__startswith="TensorFlow")
<QuerySet [<Post: TensorFlow를 활용한 네이버쇼핑의 상품 카테고리 자동 분류,네이버,2019-05-02 00:00:00+00:00,0,0>, <Post: TensorFlow를 활용한 네이버쇼핑의 상품 카테고리 자동 분류,네이버,2019-05-01 15:00:00+00:00,0,0>, <Post: TensorFlow.js: 웹 프론트엔드에서 머신러닝 활용하기,라인,2019-02-26 15:00:00+00:00,0,0>]>
Post.objects.filter(date__year=2023)
<QuerySet [<Post: Local key-value 스토리지가 고민일땐 RocksDB 어때?,네이버,2023-11-07 00:00:00+00:00,1,0>, <Post: AI 경량화: 더 빠르고 저렴한 AI 서비스,네이버,2023-10-31 00:00:00+00:00,0,0>, <Post: Kafka에서 파티션 증가 없이 동시 처리량을 늘리는 방법 - Parallel Consumer,네이버,2023-10-24 00:00:00+00:00,0,0>, <Post: AOP in TypeScript,네이버,2023-10-17 00:00:00+00:00,0,0>, <Post: flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기,네이버,2023-09-22 00:00:00+00:00,0,0>, <Post: 시니어 개발자가 대화형 인공지능(ChatGPT)과 페어 프로그래밍하는 법(feat. DEVIEW 2023 코드 구현하기),네이버,2023-09-11 00:00:00+00:00,1,0>, <Post: flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기,네이버,2023-08-29 00:00:00+00:00,0,0>, <Post: "나는 네이버 프런트엔드 개발자입니다" 출간 여정기,네이버,2023-08-25 00:00:00+00:00,0,0>, <Post: 입만 가지고 떠드는 개발자가 ChatGPT에게 외주줘서 만든 Mysql 복제지연 모니터링,네이버,2023-08-22 00:00:00+00:00,0,0>, <Post: ZGC의 기본 개념 이해하기,네이버,2023-08-17 00:00:00+00:00,0,0>, <Post: 분산디비지만 노출은 하고싶어 - mongo로 노출 전용 DB 만들기,네이버,2023-08-16 00:00:00+00:00,0,0>, ...]>

SQL문 확인

print(Post.objects.filter(title__startswith="TensorFlow").query)
SELECT `techs_post`.`id`, `techs_post`.`title`, `techs_post`.`company_id`, `techs_post`.`date`, `techs_post`.`views`, `techs_post`.`likes`, `techs_post`.`url` FROM `techs_post` WHERE `techs_post`.`title` LIKE BINARY TensorFlow%
  • filter를 복잡하게 줄 경우 SQL문이 잘 실행되고 있는지 파악할 때 활용!

.objects.count()

Post.objects.count()

# 3090
  • 옵션 연결해서도 사용 가능
Post.objects.filter(id__gt=30).count()

# 3060

.objects.values()

  • dictionary 타입

모든 필드

Company.objects.values()
<QuerySet [{'id': 11, 'company_name': 'SK플래닛'}, {'id': 5, 'company_name': '강남언니'}, {'id': 1, 'company_name': '네이버'}, {'id': 4, 'company_name': '당근'}, {'id': 13, 'company_name': '데보션'}, {'id': 10, 'company_name': '라인'}, {'id': 8, 'company_name': '무신사'}, {'id': 9, 'company_name': '뱅크샐러드'}, {'id': 2, 'company_name': '쏘카'}, {'id': 3, 'company_name': '왓챠'}, {'id': 15, 'company_name': '요기요'}, {'id': 18, 'company_name': '우아한형제들'}, {'id': 7, 'company_name': '이스트소프트'}, {'id': 14, 'company_name': '카카오'}, {'id': 16, 'company_name': '카카오엔터프라이즈'}, {'id': 6, 'company_name': '카카오페이'}, {'id': 17, 'company_name': '쿠팡'}, {'id': 12, 'company_name': '하이퍼커넥트'}]>

특정 필드

Post.objects.values('title')
<QuerySet [{'title': 'Local key-value 스토리지가 고민일땐 RocksDB 어때?'}, {'title': 'AI 경량화: 더 빠르고 저렴한 AI 서비스'}, {'title': 'Kafka에서 파티션 증가 없이 동시 처리량을 늘리는 방법 - Parallel Consumer'}, {'title': 'AOP in TypeScript'}, {'title': 'flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기'}, {'title': '시니어 개발자가 대화형 인공지능(ChatGPT)과 페어 프로그래밍하는 법(feat. DEVIEW 2023 코드 구현하기)'}, {'title': 'flatMap만 사용하기는 그만! Reactor 오퍼레이터 파헤치기'}, {'title': '"나는 네이버 프런트엔드 개발자입니다" 출간 여정기'}, {'title': '입만 가지고 떠드는 개발자가 ChatGPT에게 외주줘서 만든 Mysql 복제지연 모니터링'}, {'title': 'ZGC의 기본 개념 이해하기'}, {'title': '분산디비지만 노출은 하고싶어 - mongo로 노출 전용 DB 만들기'}, {'title': 'React 파이버 아키텍처 분석'}, {'title': '대규모 언어모델 너도 나도 업무에 사용해보자: To Beginner'}, {'title': '스마트 동기화 - File Provider를 사용한 똑똑한 동기화'}, {'title': '뭣? 딸깍 몇 번에 웹 E2E 테스트 코드를 생성하고 수행한다고? 에러도 잡아준다고? 영상도 뽑아준다고?'}, {'title': '성능 하면 빠질 수 없는 메모이제이션, 네가 궁금해'}, {'title': '네이버 검색 SRE 2편 - 측정하지 않으면 개선할 수 없다! SRE KPI 개발기'}, {'title': '네이버 검색 SRE 1편 - 차세대 검색 모니터링 시스템을 향한 여정'}, {'title': 'Spring Batch를 더 우아하게 사용하기 - Spring Batch Plus'}, {'title': '@webtoon/psd 라이브러리 개발기'}, '...(remaining elements truncated)...']>

.objects.values_list()

  • list 타입
  • 각 데이터는 튜플로
Company.objects.values_list()
<QuerySet [(11, 'SK플래닛'), (5, '강남언니'), (1, '네이버'), (4, '당근'), (13, '데보션'), (10, '라인'), (8, '무신사'), (9, '뱅크샐러드'), (2, '쏘카'), (3, '왓챠'), (15, '요기요'), (18, '우아한형제들'), (7, '이스트소프트'), (14, '카카오'), (16, '카카오엔터프라이즈'), (6, '카카오페이'), (17, '쿠팡'), (12, '하이퍼커넥트')]>

.objects.order_by()

  • QuerySet 타입
  • 특정 필드를 기준으로 정렬
  • 기본 오름차순
  • 필드명 앞에 -가 붙으면 내림차순 정렬
Company.objects.order_by('-id')
<QuerySet [<Company: 우아한형제들>, <Company: 쿠팡>, <Company: 카카오엔터프라이즈>, <Company: 요기요>, <Company: 카카오>, <Company: 데보션>, <Company: 하이퍼커넥트>, <Company: SK플래닛>, <Company: 라인>, <Company: 뱅크샐러드>, <Company: 무신사>, <Company: 이스트소프트>, <Company: 카카오페이>, <Company: 강남언니>, <Company: 당근>, <Company: 왓챠>, <Company: 쏘카>, <Company: 네이버>]>

.objects.first() / last()

  • 객체 타입
  • QuerySet 결과 중 가장 첫번째 / 마지막 row만 조회
Company.objects.first()
# <Company: 네이버>

Company.objects.last()
# <Company: 우아한형제들>

row 삭제

  • 삭제할 데이터를 변수에 저장하고 .delete()
a = Post.objects.get(id=100)
a.delete()