4.Django Shell, Django Model

1 분 소요

Django Shell

  • Django Shell 실행 방법 : python manage.py shell
    • –command 옵션 : python -c “print(2)”
      • 뒤 코드를 바로 파이썬으로 보냄
import os
# 현재 프로세스상의 환경변수만 설정
os.environ['DJANGO_SETTINGS_MODULE'] = 'askcompany.settings'
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"  # 장고 3.0 이후 비동기 지원으로 인해 추가된 환경변수

import django
django.setup()  # 장고 프로젝트 셋업

Django Model

모델 조회 방법

# 모델 접근
from instagram.models import Post 
# SELECT * FROM app_model
qs = Post.objects.all()

# SELECT * FROM app_model ORDER BY id DESC LIMIT 10;
Post.objects.all().order_by('-id')[:10]

# INSERT INTO app_model (title) VALUES ("New Title");
Post.objects.all().order_by('-id')[:10]

# 장고 프로젝트의 모든 리소스에 접근이 가능해졌다.
from django.contrib.auth import get_user_model

User = = get_user_model()
print(User.objects.all()

필터링(filter, exclude)

SELECT 쿼리에 WHERE, WHERE NOT 추가

  • 인자로 “필드명 = 조건값” 지정
query = '메시지'  # 검색어
qs = Post.objects.all()
qs = qs.filter(message__icontains=query)
qs = qs.order_by('-pk')
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE `instagram_post`.`message` LIKE %메시지% ORDER BY `instagram_post`.`id` DESC

query = '메시지'  # 검색어
qs = Post.objects.all()
qs = qs.exclude(message__icontains=query) # qs.exclude()
qs = qs.order_by('-pk')
print(qs.query)
qs
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE NOT (`instagram_post`.`message` LIKE %메시지%) ORDER BY `instagram_post`.`id` DESC

and, or 조건

  • and는 Q를 안써도 됨
  • Q객체를 사용한 후 비트 연산자를 이용해 and 또는 or연산을 할 수 있다. WHERE절에 AND 또는 OR가 출력된 걸 확인해볼 수 있다.
from django.db.models import Q

qs = Post.objects.all()
qs = qs.filter(id__gte=2, message__icontains=query)
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 AND `instagram_post`.`message` LIKE %메시지%)

qs = Post.objects.all()
qs = qs.filter(Q(id__gte=2) & Q(message__icontains=query))
print(qs.query) 
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 AND `instagram_post`.`message` LIKE %메시지%)

qs = Post.objects.all()
qs = qs.filter(Q(id__gte=2) | Q(message__icontains=query))
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 OR `instagram_post`.`message` LIKE %메시지%)
  • lt -> less than
  • lte -> less than equal
  • gt -> greater than
  • gte -> greater than equal

QuerySet(장고 성능향상에 아주 중요함)

SQL을 생성해주는 인터페이스(순회 가능한 객체)

  • QuerySet은 Chainning을 지원
    • Post.objects.all().filter(…).exclude() … -> QuerySet
  • QuerySet은 Lazy한 특성을 가지고 있어 실제 데이터가 필요한 시점에만 DB접근
    • 필요시점
      • QuerySet
      • print(query)
      • list(queryset)
      • for instance in queryset: print(instance)

댓글남기기