wecode day 11- django queryset

hyeyul·2020년 4월 30일
1

Django

목록 보기
2/8

QuerySet 이 뭐지?

단순하게 말하자면, 쿼리셋은 전달받은 모델의 객체들의 목록이다. 쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬할 수 있다.query란 데이터베이스에 정보를 요청하는 것을 의미하며 파이썬으로 작성한 코드가 sql로 매핑되어 queryset이라는 자료 형태로 넘어오게 된다.
먼저,

python manage.py shell

위의 코드를 입력해서 shell로 들어간다.

>>> from account.models import Account

account.models에서 Account라는 클래스를 먼저 import 해줘야한다.

예를 들면,

>>> id1=Account.objects.filter(id=1")

이렇게 id1라는 변수로 값을 저장한다해도 실제 DB에는 아무런 영향을 미치지 않는다. 그 이유는 queryset의 특징인 Lazy한 특성때문에 실제로 DB에 아무런 메세지도 전달하지 않는다.
진짜로 DB의 레코드를 가져오려면 fetch 와 쿼리셋을 iterate시켜야한다.

객체별 접근방식

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

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

>>> Account.objects.all()
<QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>

이렇게 작성하면 Account라는 클래스의 모든 객체를 리스트(List)형태로 가져온다.
그러므로 그안에 데이터에 접근하려면 인덱스를 사용해야한다.

>>> a = Account.objects.all()
>>> a[0]
<Account: Account object (2)>

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

.values()는 리스트안에 dictionary의 형태로 모든 속성값들을 가져온다.

>>> Account.objects.values()
<QuerySet [{'id': 2, 'name': 'quddnr', 'phone': '01032422', 'email': 'bunber@sds.com', 'password': '123', 'created_at': datetime.datetime(2020, 4, 30, 10, 55, 20, 868747), 'updated_at': datetime.datetime(2020, 4, 30, 10, 55, 20, 868794)}, {'id': 3, 'name': 'anger', 'phone': '4443333', 'email': 'anger@hanmail.net', 'password': '112344', 'created_at': datetime.datetime(2020, 4, 30, 11, 23, 3, 770534), 'updated_at': datetime.datetime(2020, 4, 30, 11, 23, 3, 770601)}]>

.values()는 항상 쿼리셋 뒤에만 붙을 수 있다.

예를 들면,

Account.objects.all().values()
Account.objects.filter(id=1).values()

이런식으로 쿼리셋 형태 뒤에 올 수 있지만. object 형태 뒤에는 올 수가 없다.

>>> Account.objects.get(id=2) 
<Account: Account object (2)>
>>> Account.objects.get(id=2).values()Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Account' object has no attribute 'values'

또한 Account.objects.values()[index]['key'] 이런 형식으로 value값에 접근이 가능하다.

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

filter()는 주어진 parameter에 따라 query의 결과를 필터하며, 결과는 리스트로 반환한다.

>>> Account.objects.filter(id=2)
<QuerySet [<Account: Account object (2)>]>

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

get()은 dictionary의 요소 하나만을 반환한다.
해당 조건의 요소가 존재하지 않을때는 DoesNotExist, 여러개 존재할때는 MultipleObjectsReturned 에러가 발생한다.
하나의 객체만 반환되기 때문에, dot notation으로 접근이 가능하다. .name

>>> c = Account.objects.get(id=1)
>>> c.name

'Kim'

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

Acount.objects.exclude()

filter 와 상반되는 개념으로, 필드명=조건값 으로 들어오는 인자를 제외한 나머지 값들을 가져온다.

get

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

>>> Account.objects.first()

가장 첫번째 데이터를 가져온다.

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

>>> Account.objects.last()

가장 마지막 데이터를 가져온다.

0개의 댓글