개발환경 설정하기 for Mac
Django Project 생성하기
Django App 생성하기
모델 만들기
Django의 다양한 모델 필드 활용하기
Django Admin
Django Shell
서로 다른 유형과 목적의 프로젝트를 하나의 공간에서 관리하면, 매번 프로젝트를 실행할 때마다 환경을 체크하고 변경해줘야 하며, 프로젝트 간의 충돌이 발생할 수도 있음
conda create -n django_env python = 3.9
conda activate django_env
pip3 install django
django-admin startproject projectname
manage.py: Django 프로젝트를 터미널에서 조작할 수 있는 명령 제공
project 디렉토리 내에서 python manage.py runserver
: Django 서버 실행
브라우저에서 localhost(127.0.0.1:8000) 으로 접속했을 때 위와 같이 출력되면 서버가 제대로 실행된 것
Django project는 웹사이트, Django app은 웹페이지에 해당
python manage.py startapp polls
: polls 라는 이름의 app 생성
url 추가
projectname/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
# 'polls/'로 들어오는 요청은 polls app의 urls.py에서 처리
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
# 'polls/'로 요청이 들어올 경우, index 페이지 반환
path('', views.index, name = "index"),
]
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world.")
관계형 데이터베이스(RDB: Relational DataBase)
데이터를 행과 열로 이루어진 테이블의 형태로 구성하고, 테이블 간의 관계를 정의하는 데이터베이스
열(Column)
테이블에 존재하는 필드(Field)
Primary Key: 테이블의 각 행을 고유하게 식별할 수 있는 열
Foreign Key: 다른 테이블의 Primary Key를 참조하는 열
행(Row)
모델: Django에서 데이터베이스를 관리할 수 있는 ORM(Object Relation Mapping)의 일종
모델 생성
polls/models.py
from django.db import models
# 질문 모델
class Question(models.Model):
question_text = models.CharField(max_length = 200)
pub_date = models.DateTimeField('date published')
# 생성한 지 하루 이내인지 확인하는 메서드
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days = 1)
def __str__(self):
if self.was_published_recently():
new_badge = 'NEW!!'
else:
new_badge = ''
return f'{new_badge} 제목: {self.question_text}, 날짜: {self.pub_date}'
# 답변 모델
class Choice(models.Model):
# Foreign Key를 사용해 질문 테이블과 관계 정의
question = models.ForeignKey(Question, on_delete = models.CASCADE)
choice_text = models.CharField(max_length = 200)
votes = models.IntegerField(default = 0)
모델에 대한 마이그레이션 진행
projectname/settings.py
INSTALLED_APPS = [
# 프로젝트에 polls app 등록
'polls.apps.PollsConfig',
...
]
python manage.py makemigrations polls
: 마이그레이션 생성
python manage.py sqlmigrate polls 0001
: 마이그레이션 내용 출력python manage.py migrate
: 마이그레이션 진행(테이블 생성)
https://docs.djangoproject.com/en/4.2/ref/models/fields/
자주 사용되는 필드
BooleanField
CharField
DateField
DateTimeField
FloatField
JSONField
TextField
Django에서 기본으로 제공하는 sqlite3 사용해 모델(테이블) 확인
sqlite3 db.sqlite3
: sqlite3 터미널 접속
.tables
: 전체 테이블 확인
.schema table_name
: 테이블의 스키마(구조) 확인
Ctrl + D
: 종료
마이그레이션 되돌리기
python manage.py migrate polls 0001
DB에 대한 CRUD(Create, Read, Update, Delete) 기능 제공
python manage.py createsuperuser
: admin 계정 생성
localhost:8080/admin
: admin 사이트 접속
admin 사이트에 모델 등록하기
polls/admin.py
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
python manage.py shell
: Django shell 진입
자동으로 변경사항이 반영되지 않기 때문에 코드 수정 시 종료 후 재시작 해야 함
Question 객체 출력
Question.objects.all()
: 모든 객체
Question.objects.first()
: 첫 번째 객체
Question.objects.last()
: 마지막 객체
Question 객체와 Choice 객체가 일대다 관계일 경우
question.choice_set.all()
: Question 객체와 연결된 모든 Choice 객체 접근
choice.question
: Choice 객체에서 Question 객체 접근
question.choice_set.create(...)
: Question 객체에 대한 Choice 객체 추가
Django는 글로벌 웹서비스 프레임워크이기 때문에 datetime 대신 timezone을 사용해 현재 시각 구함
from django.utils import timezone
now = timezone.now()
레코드 생성하기
obj.save()
: Django shell에서 생성한 객체를 모델에 저장
DateTimeField(auto_now_add = True)
: 객체가 처음 생성된 시각 자동 저장
DateTimeField(auto_now = True)
: 객체가 갱신될 때마다 현재 시각 자동 저장
레코드 수정 및 삭제하기
수정
obj.field = new_field
obj.save()
obj.delete()
: 삭제
모델 필터링(Model Filtering)
get()은 조건에 맞는 데이터 하나만 가져오고, filter()는 조건에 맞는 데이터를 모두 가져옴
filter()는 객체가 담긴 QuerySet 반환
obj.query
: 실행되는 쿼리문
Obj.objects.get(id = 1)
: id로 검색
Obj.objects.get(field__startswith = '...')
: 텍스트 타입의 필드가 특정 문자(열)로 시작하는 데이터 검색
Obj.objects.filter(datetimeField__year = 2023)
: datetime 타입의 필드가 특정 연도를 갖는 데이터 검색
Obj.objects.filter(field__contains = '...')
: 텍스트 타입의 필드가 특정 문자(열)를 포함하는 데이터 검색
Obj.objects.filter(intField__gt = 3)
: 정수 타입 필드의 값이 특정값 이상인 데이터 검색
Obj.objects.filter(field__contains = '...').update(field)
: 필터링된 데이터 갱신
Obj.objects.filter(field__contains = '...').delete()
: 필터링된 데티어 삭제
Obj.objects.filter(field__regex = r'정규표현식')
: 정규표현식 형태의 데이터 검색
Obj.objects.exclude(field__contains = '')
: 텍스트 타입의 필드가 특정 문자(열)를 포함하는 데이터는 제외하고 검색
여러 개의 필터를 중첩해서 사용 가능
Obj.objects.filter(A).filter(B)
https://docs.djangoproject.com/en/4.2/ref/models/querysets/#field-lookups
터미널에서 명령어 실행 시 아무런 반응이나 메시지가 없을 경우, 대부분 제대로 실행된 것
에러 발생 시 메시지 자세히 읽어보기