config
보안, 세팅 값들
- urls.py : 주소에 접근하는 것을 만들 수 있다.
- settings.py : 한국어 설정 등
앱 만들기
django-admin startapp pybo
- localhost:8000/pybo로 접속
- 404 에러 발생, urls에서 코드 조정
from pybo import views # pybo 디렉토리에 있는 views를 가져오기
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', views.index) # views의 index를 만들기
]
- views.py
from django.http import HttpResponse
# Create your views here.
# request를 반드시 써줘야함(사용하지 않더라도)
def index(request):
# 해당 문자열을 Http방식으로 반환해주는 메소드
return HttpResponse("안녕하세요, Pybo 메인 페이지입니다")
django 로직
- https://localhost:8000/pybo/ 요청
- config/urls.py 먼저 확인
- path('pybo/', views.index)
- pybo라는 주소는 pybo 디렉터리의 views 파일을 참조하네?
- 그리고 뒤를 보니 index 함수를 찾아가네
- index 함수에서 처리되어서 -> 결과가 응답(반환) - httpResponse
main 페이지가 아니라 pybo를 쓰는 이유
- 하나의 메인 서버가 있으면 분리되는 기능은 다른 주소로 관리되는 게 기본 로직
- localhost:8000/
- 게시판 : localhost:8000/pybo
- 쇼핑몰 : localhost:8000/shop
- 하나의 경로마다 계속 다른 app을 만들어 주는 것
url 관리
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', views.index),
path('pybo/create', views.index),
path('pybo/view', views.index),
path('pybo/update', views.index),
path('shop/', views.index),
path('blog/', views.index),
path('mail/', views.index),
]
위에처럼 쓰지 않고, include를 통해서 한 app 내 url을 관리합니다.
from django.contrib import admin
from django.urls import path
from pybo import views
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', include('pybo.urls'))
]
pybo 디렉터리 밑에, urls.py 파일을 생성해준 후, 코드 작성
from django.urls import path
from . import views
urlpatterns = [
path("", views.index), # localhost:8000/pybo 주소의 루트를 의미함
path("test/", views.test)
]
pybo의 밑에 test라는 path로 views에 있는 test 함수를 불러옵니다.
Django 참조 로직(app 내에 하위 페이지를 매핑할 경우)
- config/urls.py 먼저 참조
- config/urls.py에서 정의된 path() 함수에 해당하는 디렉터리로 이동
- pybo/urls.py 참조
- urls.py에 정의된 path() 함수에 해당하는 views 파일의 함수들을 참조
MYSQL로 연동
- 파일기반 데이터베이스 : H2, SQLite, SQLALchemy, ...
- config - settings.py -> DATABASE 딕셔너리 수정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pybo',
'USER' : '유저명',
'PASSWORD' : '비밀번호',
'HOST' : 'localhost',
'PORT' : '포트번호'
}
}
저장 후 실행했을 때, mysql client 설치하라는 내용 뜨면
pip install mysqlclient
MYSQL 데이터베이스 만들기
mysql workbench에서
show databases;
create database pybo;
데이터베이스 연동 후 경고문
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
해당 에러는 데이터베이스에 장고에 필요한 관련 테이블을 만들라고 하는 건데
python manage.py migrate
를 해보면, 연동된 데이터베이스에 테이블을 자동으로 생성한다.
데이터베이스에 필요한 테이블 추가하기
데이터베이스에 필요한 테이블들을 생성합니다. models.py 파일을 활용합니다.
from django.db import models
# Models의 Model이란 클래스 상속
class Question(models.Model):
subject = models.CharField(max_length=200) # models에서 문자열 필드(200바이트까지 제한)
content = models.TextField() # 문자열 제한이 없는 데이터 타입
create_date = models.DateTimeField() # 날짜와 시간
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete= models.CASCADE) # Question을 외래키로, 삭제시 참조되는 모든걸 삭제
content = models.TextField()
create_date = models.DateTimeField()
데이터베이스를 업데이트하기 위해선, settings.py에서 코드를 수정해야 합니다.
INSTALLED_APPS = [
'pybo.apps.PyboConfig', # pybo 디렉토리의 apps.py에 있는 PyboConfig를 참조합니다.
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
터미널에서 데이터베이스를 업데이트합니다
python manage.py makemigration
python manage.py migrate
MYSQL에서 테이블이 업데이트된 것을 확인합니다.
apps.py의 auto_field
default_auto_field = 'django.db.models.BigAutoField'
데이터베이스에서 자동으로 id값을 1씩 늘려 생성합니다.
장고 Shell
터미널에서 테스트 전용 shell을 실행합니다.
python manage.py shell
데이터 삽입을 테스트합니다. 주석을 제외한 나머지를 한 줄씩 터미널에 붙여 넣습니다.
# manage.py shell의 라이브러리 선언부
from pybo.models import Question, Answer
from django.utils import timezone
# 데이터 삽입부
q = Question(subject="장고는 쓸만한가요?", content = "Python에서는 웹프레임워크로 장고랑 Flask, streamlit이 가장 유명합니다.", create_date = timezone.now()) # Question 클래스 사용
q.save() # 저장하기
이후 데이터베이스에 잘 들어갔는지 확인한 후, 여러 개 테스트해봅니다.
q = Question(subject="리액트는 어떻습니까?", content = "리액트 배우려고하는데 막막하네요", create_date = timezone.now())
q.save()
q = Question(subject="장고는 쓰레기인가요?", content = "아뇨;; 해외에서는 API 서버로도 많이 사용하고 있어요;;", create_date = timezone.now())
q.save()
q = Question(subject="장고 너무 잼있어요!", content = "장고는 너무 재밌는것 같아요 ㅎㅎ", create_date = timezone.now())
q.save()
q = Question(subject="장고 싫어요ㅠ", content = "파이썬이라 직관적이긴한데... 어렵네요", create_date = timezone.now())
q.save()
ORM 기능 확인
ORM이란 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말합니다(Object Relational Mapping)
데이터 가져오기 - get, filter
Question.objects.all()을 통해서, Question에 있는 데이터를 확인할 수 있습니다.
Question.objects.all()
상속받은 클래스에서 __str__의 return 값을 subject로 변경해 주면, objects의 값을 subject로 볼 수 있습니다.
class Question(models.Model):
subject = models.CharField(max_length=200) # models에서 문자열 필드(200바이트까지 제한)
content = models.TextField() # 문자열 제한이 없는 데이터 타입
create_date = models.DateTimeField() # 날짜와 시간
def __str__(self):
return self.subject
Question.objects.filter(id=1) # id가 1인 값의 object를 조회합니다.
Question.objects.filter(subject__contains="장고") #subject 컬럼에서 "장고"라는 문자열이 포함된 Questions를 리턴합니다.
Question.objects.get(id=1) # id가 1인 값을 가져옵니다.
데이터 수정
Question의 일부 Object를 수정하는 방법은 다음과 같습니다.
q = Question.objects.get(id=1) # id가 1인 값을 가져와서 q라는 변수에 저장합니다.
q.subject = "장고는 쓸만하지 않은 것 같습니다." # 변수 q의 subject를 수정합니다.
q.save() # 저장합니다.
데이터 삭제
Question의 일부 Object를 삭제하는 방법은 다음과 같습니다.
q = Question.objects.get(id=1)
q.delete()
q.save()
answer 데이터 삽입
question의 id가 2인 값을 참조해서 값을 데이터베이스에 집어넣습니다.
q = Question.objects.get(id=2)
a = Answer(question = q, content = "아뇨, 아닌데요?", create_date = timezone.now())
a.save()
a = Answer(question = q, content = "흠.. 잘 모르겠네요..", create_date = timezone.now())
a.save()
question_id가 2인 것에 대해서 answer가 만들어진 것을 볼 수 있습니다.(외래키)
q = Question.objects.get(id=2)
q.answer_set.all() # answer_set에서 q와 매치되는 모든 것들을 조회합니다.
'웹 애플리케이션 > Django(장고)' 카테고리의 다른 글
[Django] 템플릿 include (0) | 2023.04.19 |
---|---|
[Django] 화면 꾸미기 (1) | 2023.04.19 |
[Django] 관리자 계정 및 페이지, 동적 URL, 별칭 (0) | 2023.04.13 |
[Django] 시작하기(Conda, VS코드 쉽게) (0) | 2023.04.12 |
[Django] 시작하기(venv 모듈 활용) (0) | 2023.04.12 |