[Django] QuerySet

황인용·2020년 8월 28일
6

Django

목록 보기
9/13
post-custom-banner

QuerySet(쿼리셋)이란

  • 데이터베이스에서 전달받은 모델의 객체 목록.
  • 데이터베이스의 여러 레코드(row)를 담은 형태.
  • 리스트와 구조는 같지만, 파이썬 기본 자료구조가 아니여서 별도 자료형 변환이나 serializers가 필요
>>> from user.models import User
>>> user = User.objects.all()
>>> user
<QuerySet [<User: User object (1)>, <User: User object (2)>]>

>>> type(user)
<class 'django.db.models.query.QuerySet'>
  • objects는 Model Manager
  • 즉, Django Model과 데이터베이스 사이의 Query Operation(질의 연산)의 인터페이스 역할
  • objects를 통해 반환되는 객체가 QuerySet

QuerySet CRUD

Create - 데이터 생성/입력

  • SQL의 INSERT
  • .creat() 와 .save() 방식이 있음

create()

>>> from user.models import User
>>> User.objcets(first_name="Inyong", last_name="Pang")

save()

>>> from user.models import User
>>> user = User(first_name="Inyong", last_name="Pang")
>>> user.save()

Read - 데이터 조회

  • SQL의 SELECT
  • objects를 통해 가져온 QuerySet에서 조건에 따른 객체를 가져오는 메소드

all()

  • 모든 row들을 가져오기 위해 사용하는 메소드
>>> User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>

values()

  • queryset 결과의 내용을 dictionary(딕셔너리)형태의 element를 담은 리스트형태로 반환
>>> User.objects.values()
<QuerySet [{'id': 1, 'name': '첫째', 'email': 'test01@gmail.com'}, {'id': 2, 'name': '둘째', 'email': 'test02@gmail.com'}, {'id': 3, 'name': '셋째', 'email': 'test03@gmail.com'}, {'id': 4, 'name': '넷째', 'email': 'test04@gmail.com'}, {'id': 5, 'name': '다섯째', 'email': 'test05@gmail.com'}]>

values_list()

  • queryset 결과의 내용을 tuple(튜플)형태의 element를 담음 리스트형태로 반환
  • key는 없고, 오로지 value만 튜플형태로 담음
>>> User.objects.values_list()
<QuerySet [(1, '첫째','test01@gmail.com'), (2, '둘째', 'test02@gmail.com'), (3, '셋째', 'test03@gmail.com'), (4, '넷째', 'test04@gmail.com'), (5, '다섯째', 'test05@gmail.com')]>

first()

  • queryset 결과의 내용 중 가장 첫번째 row만 반환
>>> user = User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>
>>> user.first()
<User: User object (1)>

last()

  • queryset 결과의 내용 중 가장 마지막 row만 반환
>>> user = User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>
>>> user.last()
<User: User object (5)>

count()

  • queryset 결과의 row의 갯수를 반환
>>> user = User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>
>>> user.count()
5

get()

  • 하나의 row만 가져오기 위해 사용하는 메소드
  • .get() 뒤에 다른 메소드를 추가할 수 없음
  • Unique 한 값을 조건으로 조회
  • 조건을 .get()의 매개변수로 지정
  • 조건에 따른 조회 결과가 없을 경우, DoesNotExist 메세지 발생
  • 한 개 이상의 값을 반환할 경우, MultipleObjectsReturned 메세지 발생
  • 리스트 형태의 queryset으로 반환
>>> from user.models import User
>>> user = User.objects.get(email="test01@email.com")
<User: User object (1)>

filter()

  • 하나 이상의 row들을 가져오기 위해 사용하는 메소드
  • 조건을 .filter()의 매개변수로 지정
  • 조건에 따른 조회 결과가 없을 경우, DoesNotExist 메세지 발생
  • 객체 형태의 queryset으로 반환
>>> from user.models import User
>>> User.objects.filter(is_use=True)
<QuerySet [<User: User object (1)>, <User: User object (2)>]>

exclude()

  • 특정 조건을 제외한 나머지 row들을 가져오기 위해 사용하는 메소드
  • 조건을 .exlude()의 매개변수로 지정
  • 조건에 일치하지 않는 객체를 포함한 queryset으로 반환
>>> from user.models import User
>>> User.objects.exclude(is_use=False)
<QuerySet [<User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>

AND, OR 조건

  • .filter() 메소드 사용 시, 두개 이상의 조건을 AND 또는 OR로 사용가능
  • 단, OR 조건을 사용하기 위해서는 django의 Q객체가 필요

AND 조건

>>> User.objects.get(email="test01@gmail.com", name="InyongPang")
<User: User object (2)>

>>> User.objects.filter(last_name="Pang", is_use=True)
<QuerySet [<User: User object (2)>, <User: User object (3)>]>

>>> import django.db.models import Q
>>> User.objects.filter(Q(last_name="Pang") & Q(is_use=True))
<QuerySet [<User: User object (2)>, <User: User object (3)>]>

OR 조건

>>> import django.db.models import Q
>>> User.objects.filter(Q(last_name="Pang") | Q(is_use=False))
<QuerySet [<User: User object (2)>, <User: User object (3)>], <User: User object (4)>], <User: User object (5)>]>

Update - 데이터 수정

  • SQL의 UPDATE
  • 이미 존재하는 객체에 대한 필드값을 수정하는 메소드

save()

  • 한 개의 객체에 대해 수정할 경우 사용하는 메소드
>>> user = User.objects.get(email="test01@email.com")
>>> user.name 
'Pang'
>>> user.name = "Pang_modify"
>>> user.save()
>>> user.name
'Pang_modify'

update()

  • 여러개의 객체를 한꺼번에 수정할 경우 사용하는 메소드
>>> user = User.objects.filter(is_use=True)
>>> user
<QuerySet [<User: User object (1)>, <User: User object (2)>]>
>>> user.update(is_use=False)

>>> use_user = User.objects.filter(is_use=True)
>>> use_user
<QuerySet []>

Delete - 데이터 삭제

  • SQL의 DELETE
  • 객체를 삭제하기 위해 사용하는 메소드

delete()

  • 한 개 이상 또는 모든 레코드를 삭제하는 메소드
# filter 조건에 의한 레코드 삭제
>>> user = User.objects.filter(is_use=True)
>>> user
<QuerySet [<User: User object (1)>, <User: User object (2)>]>
>>> user.delete()
>>> user
<QuerySet [<User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>


# all 조건에 의한 모든 레코드 삭제
>>> user = User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>, <User: User object (5)>]>
>>> user.delete()
>>> user
<QuerySet []>
profile
dev_pang의 pang.log
post-custom-banner

0개의 댓글