오늘은 Django에서 쓰이는 QuerySet에 대하여 알아봅시다.😀
Python으로 작성한 코드가 SQL로 mapping되어 QuerySet이라는 자료 형태로 값이 넘어온다
queryset
의 특이한 점은 Lazy
한 특성을 가지고 있다는 것!!!
따라서, 실제 데이터를 가져오려면(fetch), QuerySet을 iterate시켜야 함.
for account in account_set:
print(account.name)
from .models import Account
Account.object.all() # Account 모델의 모든 데이터를 가져오자!
>> <QuerySet [<Account: 계정1>, <Account: 계정2>]>
objects
는 ModelManager이며, Database와 Django Model 사이의 인터페이스 역할을 한다. 이때, 반환되는 객체가 QuerySet이다.
Account.objects
의 의미는, objects라는 이름의 manager가 Account DB를 QuerySet형태로 만들겠다는 뜻!
QuerySet안에 있는 객체에 접근할 때에는 value에 접근하는지, dictionary의 요소에 접근하는지 등에 따라서 접근 방식이 다릅니다.
Account라는 클래스가 있다고 가정하고 사용하여 보겠습니다.
Account.odjects.all()
- 모든 객체(데이터)를 리스트 형태로 return
<variable name>[index]
로 접근이 가능
Account.objects.filter()
- 특정 데이터로 필터링해서 가져옴
- 인자로는 필드명=조건값 이 들어가며 2개 이상 들어갈 경우, 두 조건을 and로 묶어줌
<variable name>[index]
로 접근이 가능
Account.objects.values()
- 쿼리셋의 내용을 딕셔너리로 각 객체정보를 갖는 리스트 형태로 반환
- QuerySet()은 리스트이고, 객체는 dictionary 이므로
<variable name>[index]['key']
형식으로 value값에 접근이 가능
Account.objects.exclude()
filter 와 상반되는 개념으로, 필드명=조건값 으로 들어오는 인자를 제외한 나머지 값들을 가져옴
Account.odjects.get(id = 1)
- 필드명 = 조건값 를 인자로 가지며, 해당 하는 데이터가 유일하게 존재해야함.
- 0개이거나 2개 이상이면 에러가 발생.
- 해당 요소가 없을 때는, DoesNotExist 에러 발생!
- 하나의 객체로 반환되므로
.
으로 접근 가능
객체 삭제하는 법!!
객체를 삭제할 때에는 먼저 해당 포스트를 get() 메소드로 불러온 다음, delete()메소드로 삭제할 수 있음!
b = Account.objects.get(id=1)
b.delete()