
Model.py | DB와 연결됨 / DB 구조Views.py | 알고리즘 담당 / 로직 처리Template | 화면단(Html)을 담당URLs.py | URL에 따라 설정된 뷰(View)로 연결되는 작업을 수행 / 라우팅 담당Web Server(ngnix, apache 등)Python virtualenv 3.12.1 ozpython local oz
django-admin startproject config . → Django 전체 프로젝트 뼈대를 생성django-admin | Django 명령어 실행 도구startproject | 프로젝트 생성config | 프로젝트명. | 현재 디렉토리에 생성 . 을 붙이면 프로젝트 루트에 필요 이상으로 폴더가 중복되는 걸 방지

config : 기초적인 설정 파일이 들어간 폴더
├── __init__.py : Python 패키지를 만들어주는 파일
├── asgi.py, wsgi.py : 웹 서버와 Django가 통신할 때 연결해주는 역할
├── settings.py : 각종 설정 파일들
└── urls.py : url 설정들. 기본적으로 admin만 설정되어있다.
manage.py : Django를 실행시키는 명령어를 입력하는 파일
python manage.py startapp appname → Django 안에서 특정 기능 단위 "앱" 생성config/settings.py의 INSTALLED_APPS에 등록해야 함.python manage.py runserverpyenv / pyenv-virtualenv
brew install pyenvbrew install pyenv-virtualenv
which $SHELL /bin/zsh = zsh)echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrcsource ~/.zshrceval "$(pyenv init -)"eval "$(pyenv virtualenv-init -)"pyenv install --list / pyenv install 원하는 버전 
| 기능 | 명령 | 설명 |
|---|---|---|
| Python 설치 | pyenv install | 특정 버전 설치 |
| 가상환경 생성 | pyenv virtualenv | Pyenv 버전 기반 venv 생성 |
| 가상환경 삭제 | pyenv virtualenv-delete 가상환경 이름 | 가상환경 지우기 |
| 폴더 적용 | pyenv local | .python-version 파일 생성 → 해당 폴더 진입 시 자동 적용 |
pyenv virtualenv 3.12.2 venv_A / pyenv virtualenv 3.12.2 venv_Bpyenv local venv_A /pyenv local venv_B

127.0.0.1:8000/
127.0.0.1:8000/book_list/
127.0.0.1:8000/book_list/<int:num>
127.0.0.1:8000/language/<str:lang>/
127.0.0.1:8000/movie/ or movie/<int:index>










models.pyviews.pytests.pyapps.pyadmin.py__init__.pymigrations
settings.py 의 INSTALLED_APPS 에 추가INSTALLED_APPS 을 DJANGO_APP 과 OWN_APPS 로 분리DJANGO_APPS)과 OWN_APPS)을 구분하여 관리하기 위해서 views.py 와 Models.py 는 Django의 App 구조 안에 들어 있음

Model: 데이터베이스의 테이블 / Field: 데이터베이스의 컬럼

python manage.py makemigrations = git의 commit 느낌python manage.py migrate = git의 push 느낌python manage.py makemigrationsmigrations.py 파일을 만듬migrate 명령어를 사용하기 전까지 데이터베이스에 영향을 주지 않음(실제 DB에는 영향 X)python manage.py migrate1. migrations 실행
python manage.py makemigrations 명령어로 마이그레이션 파일을 생성
2. migrate 실행
python manage.py migrate 명령어로 데이터베이스에 변경 사항을 적용
Django는 강력한 관리자(어드민) 페이지를 가진 프레임워크
127.0.0.1:8000/admin/ 로 접속 가능Admin Page를 이용하기 위해서는 접근 권한을 가진 SuperUser가 필요
python manage.py createsuperuser
북마크 테이블을 어드민 페이지에서 관리해보기

한국어 변경




objects.all() / all : SELECT * FROM bookmarks

target="_blank" 
Table.objects.all() Table.objects.get(pk=pk) Table.objects.filter(pk=pk) Bookmark = Bookmark.objects.all()
SELECT * FROM bookmark
# get
Bookmark: Bookmark = Bookmark.objects.get(pk=pk)
SELECT * FROM bookmark WHERE id=id LIMIT 1
# filter
Bookmark: [Bookmark] = Bookmark.objects.filter(pk=pk)
SELECT * FROM bookmark WHERE id=id
Bookmark: [Bookmark] = Bookmark.objects.filter(name='네이버')
SELECT * FROM bookmark WHERE naem='네이버'
Bookmark: [Bookmark] = Bookmark.objects.filter(name__icontains='네이')
SELECT * FROM bookmark WHERE naem LIKE '%네이버%'
# gte = greater then equal == '>='
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__gte=now)
SELECT * FROM bookmrak WHERE created_at >= now
# gt = greater == '>'
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__gt=now)
SELECT * FROM bookmrak WHERE created_at > now
# lte = low then equal == '<='
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__lte=now)
SELECT * FROM bookmrak WHERE created_at <= now
# lt = low == '<'
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__lt=now)
SELECT * FROM bookmrak WHERE created_at < now
ipython — 더 똑똑한 파이썬 쉘

ipython 패키지 설치 : poetry add ipython
장고 쉘 들어가기 : python manage.py shell

poetry add django-extensions : 여러가지가 한번에 임포트 됨 (권장)
python manage.py shell_plus

# bookmark App의 모델인 Boormark를 import
from bookmark.models import Bookmark
# Bookmark 테이블의 모든 객체를 가져오기
Bookmark.objects.all()
# Bookmark 테이블에서 id가 2인 객체만 가져오기
# 조회된 객체가 2개 이상일 경우 오류 발생
Bookmark.objects.get(id=2)
# 모든 객체를 bookmark_list 변수에 할당
bookmark_list = Bookmark.objects.all()
# 첫번째 객체 가져오기
bookmark_list[0]
Bookmark.objects.first()
# 마지막 객체 가져오기
Bookmark.objects.last()
# 객체의 아이디
bookmark_list[0].id
# id가 2이상인 객체 불러오기
# gte: greater than or equal (이상)
# gt: greater than (초과)
# lt: less than (미만)
# lte: less than or equal to (이하)
Bookmark.objects.filter(id__gte=2)
# name이 네이버인 객체 가져오기
Bookmark.objects.filter(name='네이버')
## like 검색
# DB에 부담을 많이 주기 때문에 너무 짧은 검색어 사용은 지양
# 검색어가 포함된 객체 찾기
Bookmark.objects.filter(name__icontains='네')
# 검색어로 시작하는 객체 찾기
Bookmark.objects.filter(name__startswith='다')
# 검색어로 끝나는 객체 찾기
Bookmark.objects.filter(name__endswith='글')
# 지정된 리스트 내의 값들 중 하나와 일치하는 객체 찾기
Bookmark.objects.filter(name__in=['구글','네이버'])
# , 로 and 조건 검색 가능
Bookmark.objects.filter(name='네이버', url__startswith="https://naver")
# 몇개 존재하는가
Bookmark.objects.count()
# 기본
Bookmark.objects.create(name='야후', url='https://yahoo.com')
# 새로운 Bookmark 객체를 생성하고 데이터베이스에 저장
bookmark = Bookmark(name='야후2', url='https://yahoo.com')
bookmark.save()
## id값을 변경하여 새로운 데이터 만들기
# _를 쓰기 위해 모든 객체를 조회합니다.
# _는 마지막 Output값을 가져옵니다.
Bookmark.objects.all()
# b에 첫번째 데이터를 할당합니다.
b = _.first()
# b의 id를 None으로 변경합니다.
# 첫번째 데이터에는 영향이 없습니다.
b.id = None
# id값이 없는 b 객체를 저장합니다.
# DB에서는 b를 새로운 데이터로 인식합니다.
b.save()
# b의 id가 새롭게 생겼습니다.
b.id
# b 객체의 name을 변경하면 차이를 알기 쉽습니다.
b.name = '네이버2'
# 다시 모든 객체를 불러옵니다
# b가 Bookmark에 추가되었습니다.
Bookmark.objects.all()
리스트 컴프리헨션으로 만들어진 데이터는 id값을 가지지 않는다.

Bookmark.objects.bulk_create(bookmark_list)
create 할 때에는 bulk_create 를 사용하면 db요청 횟수를 줄임

## 객체 업데이트
# url에 'naver.com'이 포함된 객체들의 name을 '네이버'로 업데이트합니다.
# Output에는 변경된 객체의 수가 출력됩니다.
Bookmark.objects.filter(url__icontains='naver.com').update(name='네이버')
## 객체 삭제
# b 객체를 삭제합니다.
# 메모리에서는 사라지지 않지만, b.id 값은 존재하지 않습니다.
# Django는 id값 유무에 따라 DB 저장 유무를 판단합니다.
b.delete()
# 여러개를 한 번에 삭제
Bookmark.objects.filter(name__icontains='야후').delete()
poetry add django-extensions / python manage.py shell_plusls 했을때 manage.py가 나오는가 확인Bookmark.objects.create(name='이름',url='https://~~.com')# Shell에서
for i in range(100)
Bookmark.objects.creates(name=f'테스트 네이버 {i}',url=f'https://naver.com')
## 테스트 네이버 1~100으로 같은 url을 가진 북마크 100개 생성
Bookmark.objects.filter(id__gte=50)