(Django) QuerySet과 객체별 접근방식

Kepler·2020년 2월 6일
5

Django

목록 보기
1/12

QuerySet이란?

간단하게 말하면 Database에서 전달받은 객체들의 모음(list)이다. DB(SQL)에서는 row에 해당한다.

Python으로 작성한 코드가 SQL로 mapping되어 QuerySet이라는 자료 형태로 값이 넘어온다.

하위 코드들은 DB에 저장된 모든 객체를 불러온다.하지만, 실제로 DB에 query가 이루어지지는 않는다. 이것은 QuertSet의 lazy한 특성 때문인데, 실제로 데이터를 가져오려면(fetch), 다음과 같이 QuerySet을 iterate시켜야 한다.

for account in account_set:
	print(account.name)

객체별 접근방식

DB에는 column과 row에 데이터가 저장된다. Django에서 column에 해당하는 부분은 모델의 각 클래스안에 지정해준 속성들이며, row에 해당하는 부분은 각 속성에 부여되어 있는 값들이다. 즉 dictionary 가 저장되는 것이다.

따라서, QuerySet안에 있는 객체에 접근할 때에는 value에 접근하는지, dictionary의 요소에 접근하는지 등에 따라서 접근 방식이 다르다.

<클래스이름>.objects.values() :

  • .values()로 dictionary의 key와 value에 접근이 가능하다.
  • QuerySet()은 리스트이고, 객체는 dictionary 이므로 <variable name>[index]['key'] 의 형식으로 value값에 접근이 가능하다

<클래스이름>.objects.get(id=1) :

  • get()은 dictionary의 요소 하나를 반환한다.
  • 해당 조건의 요소가 존재하지 않을때는 DoesNotExist, 여러개 존재할때는 MultipleObjectsReturned 에러가 발생한다.
  • 하나의 객체이기에 반환되기 때문에, dot notation으로 접근이 가능하다. <variable name>.name
>>> c = Account.objects.get(id=1)
>>> c.name
'Kim'

<클래스이름>.objects.filter() or <클래스이름>.objects.all()

  • filter()는 주어진 parameter에 따라 query의 결과를 필터하며, 결과는 리스트로 반환한다.
  • all()은 QuerySet안의 모든 객체를 리스트 형태로 return한다.
  • 따라서, <variable name>[index]로 접근이 가능하다.
>>> b = Account.objects.filter(name__startswith="K")
>>> <QuerySet [<Account: Account object (1)>, <Account: Account object (2)>]>
>>> b[0]
<Account: Account object (1)>

>>> c = Account.objects.all()
<QuerySet [<Account: Account object (8)>, <Account: Account object (9)>, <Account: Account object (10)>]>
>>> c[0]
<Account: Account object (8)>

참고: 객체 삭제하는 법

객체를 삭제할 때에는 먼저 해당 포스트를 get() 메소드로 불러온 다음, delete()메소드로 삭제할 수 있다

a = Post.objects.get(id=1)

post.delete()

참고 링크:
https://ssungkang.tistory.com/entry/Django-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A1%B0%ED%9A%8C-queryset
<https://djangogo.tistory.com/entry/Djangogo-7-Django-쿼리셋과-매니저로-작업하기 [Djangogo! (장고고!)]>

profile
🔰

0개의 댓글