[django] 쥬피터에서 모델 보기 + 쿼리셋 기본 함수
쥬피터 노트북에서 실행시키는법
- 콘솔 환경이 anaconda prompt여야함.
- 콘다 터미널 접속해서 콘다 가상환경 생성
conda create --name 이름 python=3.7
- conda activate 이름
- 파이참으로 와서 interpreter 아나콘다로 바꾸기
- conda install jupyter
- python manage.py shell
- 그렇다면 shell 환경이 ipython으로 바뀌어져 있다.
- 컨트롤 D 눌러서 나오기
- jupyter notebook
- 새로운 노트북 생성
- 노트북에서 장고 환경을 세팅하기 위해서
import os os.environ['DJANGO_SETTINGS_MODULE'] = 'api.settings' os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" import django django.setup()
- 작성 후 실행
- 참고로 위에서 쓰인 DJANGO_SETTINGS_MODULE은 manage.py 파일에 가보면 어떠한 이름으로 쓰여져 있는지 볼 수 있다.
- 그렇다면 장고 환경으로 세팅이 되었으므로 우리가 쉘에서 쓰는 명령어들로 쿼리를 볼 수 있다.
쥬피터에서 쿼리 보기
모델 전체 출력
- 맨 마지막에 써있는 것이 Out으로 나옴.
- 그 전에 쓰여있는 print문은 위에 출력
- qs.query를 하면 어떤 필드명을 뽑아올수 있는지 From 무슨 모델로부터 다 나옴
루프를 이용한 모델 필드에 접근
- qs = User.objects.all() 을 하면 qs에 User 모델 전체 쿼리셋이 저장됨.
- 루프를 돌려서 각 필드에 접근 가능
for user in qs:
print("id: {id}, email: {email}, nickname: {nickname}, address: {address}".format(**user.__dict__))
- 그냥 user.__dict__를 하게 되면 전체 필드들과 필드에 해당하는 값들이 나오게 된다.
icontains를 이용한 모델 접근
- User.objects.all().filter(필드명__icontains=”걸러내고 싶은 값”)
- 이렇게 실행하면 걸러내고 싶은 값을 포함한 User의 쿼리셋이 나오게 된다.
lte, lt, gt, gte
- lte = less than equal, lt = less than, gt = grater than, gte = grater than equal
- 필드명__lte 이런식으로 사용 가능하다.
first(), last()
- first()는 쿼리셋의 첫번째 쿼리를 보여줌.
- last()는 쿼리셋의 마지막 쿼리를 보여줌.
filter의 and 연산자
- filter 파라미터에 ,는 and 연산자와 같은 기능이다.
- map 모델의 쿼리셋을 전부 불러와 qs로 저장
- 모든 쿼리셋을 루프를 돌려 필드명으로 접근
- user 모델의 쿼리셋을 전부 불러와 qs로 저장
- 모든 쿼리셋을 루프를 돌려 필드명으로 접근
- post 모델의 쿼리셋을 전부 불러와 qs로 저장
- 모든 쿼리셋을 루프를 돌려 필드명으로 접근
- post의 address와 user는 전부 ForeignKey이기 때문에 숫자로 접근해야함
- address 1번 즉 석계로 13길 40
- user 7번 즉 김진만 email : ehdgur4@naver.com
- 필터링 결과 1번 address를 가지면서 7번 user가 쓴 post를 출력해줌.
request와 Get 겉핥기
def item_list(request):
qs = Item.objects.all()
q = request.Get.get('q', '')
if q:
qs = qs.filter(name__icontains=q)
return render(requeest, 'shop/item_list.html', {
'item_list' : qs,
'q' : q,
}
- request는 url에 입력 받는것이다.
- Get.get(‘q’, ‘‘)은 url 뒤에 ?q=메세지 이런식으로 들어온다면?
- 일단 두번째 파라미터 ‘’ 빈칸은 q가 Get으로 안들어왓을때 None이 아닌 빈칸 반환이다.
- q가 들어온다면 ?q=메세지 q뒤에 문자 메세지가 저장이 된다.
- 그렇다면 q에 메세지가 저장이 되고
- filter에서 q 즉, 메세지라는 글자를 거른다.
- 검색을 구현할때 쓴다
쿼리셋의 정렬 조건 추가
쉘 플러스 이용
- pip install django-extensions
-
python manage.py shellplus –print-sql –ipython
-
이게 기본 쉘이랑 다른점이 필요한 몇몇 기능들을 import 해준다.
- class Meta 밑에 ordering = [‘id’] 이런식으로 정렬 가능
쿼리셋의 범위조건 추가
- 객체[start:stop:step]
- 역순 슬라이싱은 지원 x
- Post.objects.all()[:2]
- 처음 두개라는 뜻
- 만약 step이 들어가게 된다면 쿼리셋이 아닌 list로 반환해줌
장고 디버깅 툴바
- 현재 request/response에 대한 다양한 디버깅 정보를 보여준다.
- 다양한 Panel 지원
- SQLPanel을 통해, 각 요청 처리 시에 발생한 SQL 내역 확인 가능
- Ajax 요청에 대한 지원은 불가
- 보고 참조 IP 까지만 써주면 됨.
- 이러면 디버깅하기 더 쉬운 툴바가 나타남!
주의사항
- 웹페이지의 템플릿에 필히 “<body>” 태그가 있어야만 django-debug-toolbar가 동작합니다.
- 이유 : dbt의 html/script 디폴트 주입 타겟이 </body> 태그 (INSERT_BEFORE 설정 디폴트: “</body>”)
댓글남기기