2 분 소요

쥬피터 노트북에서 실행시키는법

  1. 콘솔 환경이 anaconda prompt여야함.
    • 콘다 터미널 접속해서 콘다 가상환경 생성
     conda create --name 이름 python=3.7
    
    • conda activate 이름
    • 파이참으로 와서 interpreter 아나콘다로 바꾸기
  2. conda install jupyter
  3. python manage.py shell
    • 그렇다면 shell 환경이 ipython으로 바뀌어져 있다.
    • 컨트롤 D 눌러서 나오기
  4. 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 파일에 가보면 어떠한 이름으로 쓰여져 있는지 볼 수 있다.
    • 그렇다면 장고 환경으로 세팅이 되었으므로 우리가 쉘에서 쓰는 명령어들로 쿼리를 볼 수 있다.

    image

쥬피터에서 쿼리 보기

모델 전체 출력

image

  • 맨 마지막에 써있는 것이 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__를 하게 되면 전체 필드들과 필드에 해당하는 값들이 나오게 된다.

image

icontains를 이용한 모델 접근

  • User.objects.all().filter(필드명__icontains=”걸러내고 싶은 값”)
    • 이렇게 실행하면 걸러내고 싶은 값을 포함한 User의 쿼리셋이 나오게 된다.

    image

lte, lt, gt, gte

  • lte = less than equal, lt = less than, gt = grater than, gte = grater than equal
  • 필드명__lte 이런식으로 사용 가능하다.

image

first(), last()

  • first()는 쿼리셋의 첫번째 쿼리를 보여줌.
  • last()는 쿼리셋의 마지막 쿼리를 보여줌.

image

filter의 and 연산자

  • filter 파라미터에 ,는 and 연산자와 같은 기능이다.

image

  • map 모델의 쿼리셋을 전부 불러와 qs로 저장
    • 모든 쿼리셋을 루프를 돌려 필드명으로 접근
  • user 모델의 쿼리셋을 전부 불러와 qs로 저장
    • 모든 쿼리셋을 루프를 돌려 필드명으로 접근

image

  • post 모델의 쿼리셋을 전부 불러와 qs로 저장
    • 모든 쿼리셋을 루프를 돌려 필드명으로 접근
  • post의 address와 user는 전부 ForeignKey이기 때문에 숫자로 접근해야함
    • address 1번 즉 석계로 13길 40
    • user 7번 즉 김진만 email : ehdgur4@naver.com
    • 필터링 결과 1번 address를 가지면서 7번 user가 쓴 post를 출력해줌.

image

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>”)

댓글남기기