오도원입니다.

건강과 행복을 위하여

Development/Django

(Django) QuerySet과 객체 접근방식

오도원공육사 2020. 9. 8. 18:31
반응형

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형태로 반환된다.

참고.

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

djangogo.tistory.com/entry/Djangogo-7-Django-%EC%BF%BC%EB%A6%AC%EC%85%8B%EA%B3%BC-%EB%A7%A4%EB%8B%88%EC%A0%80%EB%A1%9C-%EC%9E%91%EC%97%85%ED%95%98%EA%B8%B0

velog.io/@rosewwross/session-note

 

반응형