2025/11/08 Django - 2

김기훈·2025년 11월 8일

TIL

목록 보기
49/191

오늘 학습 내용

Chapter 02. Views와 ORM

  • views.py 와 Models.py 는 Django의 App 구조 안에 들어 있음
    • App를 생성하여 views.py / Models.py를 사용해보기

앱 생성

  • models.py
    • DB와 관련된 테이블과 컬럼을 관리한다.
  • views.py
    • 메인 알고리즘을 담당한다(요청 처리 함수)
  • tests.py
    • 테스트 코드를 작성한다.
  • apps.py
    • Django App 관련 설정 관련 내용(앱 설정 파일)
  • admin.py
    • 어드민 관련된 설정 관리.( Django 관리자(admin) 설정 파일 )
  • __init__.py
    • 파이썬 패키지를 관리하는 파일.(패키지 초기화 파일)
  • migrations
    • Model이 수정된 기록이 쌓임.(DB 마이그레이션 파일)

앱 등록

  • 생성된 앱을 Django 프로젝트에 등록해야 함 → settings.py 의 INSTALLED_APPS에 추가
    • Django에서 기본적으로 제공되는 APP본인이 만든 APP을 구분하여 관리하기 위해
      • INSTALLED_APPSDJANGO_APPOWN_APPS 로 분리

Views를 활용하여 페이지 만들기

Model과 Field, Migrations

Filed Type이 정리되어있는 공식 문서

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

  • python manage.py migrate
    • Django에서 기본적으로 migrate 되어야 하는 테이블이 생성

  • makemigrations

    • python manage.py makemigrations
    • migrations.py 파일을 만듬
    • migrate 명령어를 사용하기 전까지 데이터베이스에 영향을 주지 않음(실제 DB에는 영향 X)
      • 실제 DB에 넣기위한 정의를 하는 파일을 생성
    • Django 애플리케이션의 모델에 대한 변경 사항을 감지,
      • 이를 데이터베이스 스키마로 변환할 수 있는 마이그레이션 파일을 생성
    • git 의 commit -> github에 적용X , commit 기록
      • DB에 적용X / 적용할 파일 생성
  • migrate

    • python manage.py migrate
    • 마이그레이션을 실행하여 데이터베이스에 변경 사항을 적용하는 명령어.
      • migrations/ 폴더 안에 있는 migration 파일들을 실제 DB에 적용
    • Django의 ORM(Object-Relational Mapping) 시스템을 통해
      • 데이터베이스 스키마를 최신 상태로 유지.
    • git의 push -> github에 적용O / 로컬에는 commit 기록
      • DB에 적용O / migrations 파일들 가지고 적용
    1. migrations 실행
    • python manage.py makemigrations 명령어로 마이그레이션 파일을 생성
    1. migrate 실행
    • python manage.py migrate 명령어로 데이터베이스에 변경 사항을 적용
      - bookmarkbookmark(App이름테이블이름) 테이블이 확인 가능

Django Admin

Django admin docs

  • Django는 강력한 관리자(어드민) 페이지를 가진 프레임워크

    • 로컬서버를 실행하고 127.0.0.1:8000/admin/ 로 접속 가능
    • Admin Page를 이용하기 위해서는 접근 권한을 가진 SuperUser가 필요
  • python manage.py createsuperuser

    • 이메일은 필수X / 비밀번호 8자 이상 추천 / 간단하면 경고 뜸
  • 북마크 테이블을 어드민 페이지에서 관리해보기

  • 한국어 변경

    1. 각각 어떤값이 들어가는가
    1. 북마크 이름을 바꿔보자
    1. 어드민페이지의 여러 기능을 사용해보자

북마크 목록 페이지 만들기

북마크 리스트 페이지

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

북마크 상세 페이지

  • target="_blank"
    • 새로운 페이지에서 열기

ORM

Django ORM 공식문서

objects

  • 모델 매니저 / 쿼리를 할 수 있게 해줌
    • Table.objects.all()
      • 테이블의 모든 데이터를 가져옴
      • (SELECT * FROM table 과 동일)
    • Table.objects.get(pk=pk)
      • pk가 동일한 데이터를 1개 가져옵니다. 2개 이상의 데이터를 가져오려고 하면 오류가 발생 - (SELECT * FROM table WHERE id=id LIMIT 1 과 동일)
    • Table.objects.filter(pk=pk)
      • 개수에 상관없이 리스트 형태로 데이터를 가져옴
      • (SELECT * FROM bookmark WHERE id=id와 동일)
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

SHELL

  • 장고 쉘 들어가기 : python manage.py shell

  • ipython 패키지 설치 : poetry add ipython

  • 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.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()

객체 업데이트 / 객체 삭제

## 객체 업데이트 

# 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()

추가

Bookmark.objects.count() # 몇개 존재하는가

미니 프로젝트

  • 조건 1. 북마크 100개 만들기
    • python manage.py shell_plus
      • 하기전에 현재 경로에 manage.py가 있는지 확인
      • ls 했을때 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개 생성
  • 조건 2. 북마크 목록에서 북마크의 id가 50이상인 것들만 추출해서 보여주기
    • Bookmark.objects.filter(id__gte=50)

추가 내용

  • 리스트 컴프리헨션으로 만들어진 데이터는 id값을 가지지 않는다.

  • Bookmark.objects.bulk_create(bookmark_list)
    • for문을 사용하면 한번씩 계속 반복이 되기 때문에 DB에 부담이 될 수 있음
    • 한번에 많은 양을 create할 때에는 bulk_create를 사용하면 db요청 횟수를 줄임
      • db의 부담을 줄일수 있음

어려운 내용(추가 학습 필요)

오늘 발생한 문제(발생 했다면)

profile
안녕하세요.

0개의 댓글