4.Django Shell, Django Model
Django Shell
- Django Shell 실행 방법 : python manage.py shell
- –command 옵션 : python -c “print(2)”
- 뒤 코드를 바로 파이썬으로 보냄
- –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)
- 필요시점
댓글남기기