반응형
1. QuerySet이란.
- QuerySet은 데이터베이스에서 전달받은 객체들의 list이다.
- 각 객체들은 DB에서 하나의 record(row)에 해당한다.
- Python으로 작성한 코드가 SQL로 mapping되어 QuerySet이라는 자료 형태로 값이 넘어온다.
- ORM 코드가 객체를 불러오지만 실제 DB에 쿼리가 이루어지는 것은 아니다.
- QuerySet의 lazy한 특성으로 인해 실제 데이터를 가져오기 위해서는 iterate시켜야한다.
2. 객체 접근방식
- DB는 column(field)와 row(record)에 데이터가 저장된다.
- Django에서 필드에 해당하는 부분은 모델의 각 클래스 안에서 지정해준 속성들이다.
- 레코드에 해당하는 부분은 각 속성에 부여되는 값들이다.
- 테이블의 레코드마다 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(.) notaion 접근가능. <variablename>.field_name
<클래스이름>.objects.filter(조건)와 <클래스이름>.objects.all()
- filter()는 주어진 조건에 따라 query의 결과를 필터링하여 결과를 리스트로 반환한다.
- all()은 QuerySet안의 모든 객체를 리스트로 반환한다.
- filter()와 all()의 반환값은 리스트이므로 <variablename>[index]로 접근 가능하다.
주의할 점 : values() vs filter(), all()
- values()는 key와 value로 이루어진 dictionary로 구성된 list of dictionary형태로 반환된다.
- filter()와 all()은 list of Obejct형태로 반환된다.
참고.
velog.io/@rosewwross/session-note
반응형
'Development > Django' 카테고리의 다른 글
[Django] 에러 : object has no attribute 'update' (2) | 2020.10.08 |
---|---|
(Django) 테이블 초기화하기; reset table (0) | 2020.09.14 |