**Django
(with pycharm)
-- Django (Python Full stack Web Framework)
-
Django(/dʒæŋɡoʊ/ jang-goh/쟁고/장고)는 Python으로 맊들어짂 무료 오픈소스 웹 애플리케이션 프레임워크(web application framework)
-
쉽고 빠르게 웹사이트를 개발할 수 있도록 돕는 구성요소로 이루어진 웹 프레임워크
-
백엔드를 담당하는 파이썬 풀스택 웹프레임워크 Lawrence Journal-World 싞문사에서 2003년부터 개발하여, 2005년에 세상에 공개
-
2008년에 1.0 릴리즈 (Django Roadmap)
-
기타리스트 Django Reinhardt 이름을 따서, Django (쟁고, 장고)
-
Django 와 비슷한 웹프레임워크들
-
Flask : a micro framework for Python based on Werkzeug.
-
Pyramid : a small, fast, down-to-earth,
-
Bottle : a fast and simple micro framework for small web-applications
**웹 어플리케이션 기본 구조

**Django 기본구조

urls.py, view.py, models.py, templates/blog/post_list.html
web server -> Apache, NginX
Django는 sqlite가 내장되어있음 -> 추후에 MariaDB사용
**Static Web Application(정적인 웹)
**Dynamic Web Application(동적인 웹) - db 와 연동을 함
"Seperation of concerns(responsibility)" : 관심사(책임)의 분리
-- MVC 패턴 (Spring MVC 프레임워크)
-
model-view-controller
-- MTV 패턴 (Django 프레임워크)
-
MTV(Model Template View) 패턴
1) Model : 테이블을 정의한다.
2) Template : 사용자가 보게 될 화면의 모습을 정의한다.
3) View : 애플리케이션의 제어 흐름 및 처리 로직을 정의한다.
모델은 model.py파일에, 템플릿은 templates 디렉토리 하위의 *.html 파일에,
뷰는 views.py 파일에 작성하도록 처음부터 뼈대를 만들어 줍니다.
-
모델,템플릿,뷰 모듈 갂에 독립성을 유지할 수 있고, 소프트웨어 개발의 중요한 원칙인 느슨한 결합(Loose Coupling) 설계의 원칙에도 부합된다.
-
Django에서 프로젝트를 생성하기 위해 startproject 및 startapp 명령을 실행하면 자동으로 프로젝트 뼈대(skeleton)에 해당하는 디렉토리와 파일들을 만들어 줍니다.
-- Django’s Architecture
-
Django’s Structure ( https://djangobook.com/mdj2-django-structure/ )
Django’s Structure – A Heretic’s Eye View - Python Django
Learn how Django is a very logically structured framework built on Python, that isn't complex or hard to understand once you know how it all fits together.
djangobook.com


**ORM(Object Relational Mapping)
: 객체를 RDB의 Table로 매핑
: Mapping Rule
Model Class <-> Table
Object <-> Row(Record), 행
Variable <-> Column, 열
pip install django
django-admin --version
mypython 폴더 아래에 myjango 하위 폴더를 생성한다.
# Django 프로젝트 생성
mypython> django-admin startproject mydjango .
=> django/conf/project_template 구성으로 생성 됨 #src
-
manage.py : 웹사이트 관리를 도와주는 역할을 하는 파읷
-
settings.py : 웹사이트 설정이 있는 파읷
-
urls.py : urlresolver가 사용하는 요청 패턴(URL규칙) 목록을
포함하고 있는 파읷
-
wsgi.py : Web Server Gateway Interface이며 Python의 표준
Gateway Interface 입니다.
-
asgi.py : Asynchronous Server Gateway Interface
WSGI와 비슷한 구조를 가지며, 비동기 통싞을 지원한다.
# settings.py의 LANGUAGE_CODE와 TIME_ZONE 변경하기
**mydjango/settings.py
LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul'
# settings.py에 정적 파읷 경로를 추가함 STATIC_URL항목 바로 아래에 STATIC_ROOT을 추가
**mydjango/settings.py
import os
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL)
# 데이터베이스를 생성
django_src> python manage.py migrate
=> db.sqlite3 파일이 생성됨
# Server 시작
django_src> python manage.py runserver

# Superuser 계정 생성
django_src> python manage.py createsuperuser
=> password를 체크 하므로 너무 짧거나 간단한 글자로 입력하면 안됩니다.
• http://localhost:8000/admin/ 으로 접속
id = admin /password = djangoadmin
--Blog App 작성 : Model클래스와 테이블

-- Django Model
1) Django 내장 ORM(Object Relational Mapping) ( https://docs.djangoproject.com/en/3.0/topics/db/models/ )
Models | Django documentation | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com
2) SQL을 직접 작성하지 않아도, Django Model을 통해 데이터베이스로의 접근 가능 (조회/추가/수정/삭제)
3) <Python 클래스> 와 <데이터베이스 테이블> 을 매핑
• Model : DB 테이블과 매핑
• Model Instance : DB 테이블의 1 Row
• blog앱 Post모델 : blog_post 데이터베이스 테이블과 매핑
• blog앱 Comment모델 : blog_comment 데이터베이스 테이블과 매핑
-- 첫번째 앱 <blog> 앱 생성
1) App 디렉토리 생성 django_src> python manage.py startapp blog
django/conf/app_template 구성으로 App 디렉토리가 생성되어진다. #src
2) App을 프로젝트에 등록 : 아래와 같이 mydjango/settings.py을 편집하여,
INSTALLED_APPS 항목 끝에 blog App 이름을 추가한다.
# mydjango/settings.py 파일
INSTALLED_APPS = [
# 생략
'blog',
]
-- blog앱 글(Post) Model 만들기
1) Post(게시글)의 속성들
title(제목)
text(내용)
author(글쓴이)
created_date(작성일)
published_date(게시일)
2) Model 객체는 blog/models.py 파읷에 선언하여 모델을 만듭니다. 이 Model을 저장하면 그 내용이 데이터베이스에 저장되는 것입니다.
-- Django Model
1) 커스텀 모델 정의 (blog/models.py)
2) 데이터베이스 테이블 구조/타입을 먼저 설계를 한 다음에 모델 정의
모델 클래스명은 단수형 (Posts가 아니라, Post)
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
-- 지원하는 모델필드 타입 #ref
1) Field Types :
AutoField, BigInteger, BinaryField,BooleanField, CharField, DateField, DateTimeField,DecimalField, DurationField, EmailField, FileField,ImageField, IntegerField, GenericIPAddressField, PositiveIntegerField, PositiveSmallIntegerfield, SlugField, TextField, URLField, UUIDField 등
2) Relationship Types :
ForeignKey, ManyToManyField, OneToOneField
-- 데이터 타입 매핑
1) 파이썬 데이터타입과 데이터베이스 데이터타입을 매핑 :
AutoField (int), BinaryField (bytes), BooleanField (bool), NullBooleanField (None, bool), CharField/TextField/ EmailField/GenericIPAddressField/SlugField/URLField(str)
2) 같은 파이썬 데이터 타입에 매핑 되더라도,"데이터 형식" 에 따라 여러 Model Field Types 로 나뉨.
-- 필드 옵션
1) 자주 쓰는 필드 옵션 :
null (DB 옵션) : DB 필드에 NULL 허용 여부 (디폴트 : False)
unique (DB 옵션) : 유일성 여부
blank : 입력값 유효성(validation)검사할 때 empty값 허용여부(디폴트:False)
default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용
choices (form widget 용) : select box 소스로 사용
validators : 입력값 유효성 검사를 수행할 함수를 다수 지정
각 필드마다 고유한 validators 들이 이미 등록되어 있기도 함.
ex) 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한, etc.
verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐.
help_text (form widget 용) : 필드 입력 도움말
-- blog앱 글(Post) Model 만들기
**blog/models.py
from django.db import models
from django.utils import timezone
class Post(models.Model):
author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
-- DB에 테이블 만들기
1) 마이그레이션 파일(migration file) 생성하기
django_src> python manage.py makemigrations blog
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Post
2) 실제 데이터베이스에 Model 추가를 반영하기
django_src> python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK
-- Django Admin(관리자)
1) 관리자 페이지에서 만든 모델을 보기 위해 Post 모델을 등록
**blog/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
2) 관리자 화면에서 확인하기
http://localhost:8000/admin/ 으로 접속
-- Migrations #ref
• django-south(https://south.readthedocs.io/en/latest/) 프로젝트가 킥스타터 펀딩 (£17,952, 507 Backers)을 통해, Django 1.7에 포함
South documentation — South 1.0 documentation
South is a tool to provide consistent, easy-to-use and database-agnostic migrations for Django applications.
south.readthedocs.io
• 모델 변경내역 히스토리 관리
• 모델의 변경내역을 Database Schema (데이터베이스 데이터 구조)로 반영시키는 효율적인 방법을 제공
• 관련 명령
쉘> python manage.py makemigrations <app-name> # 마이그레이션 파일 생성
쉘> python manage.py migrate <app-name> # 마이그레이션 적용
쉘> python manage.py showmigrations <app-name> # 마이그레이션 적용 현황
쉘> python manage.py sqlmigrate <app-name> <migration-name> # 지정 마이그레이션의 SQL 내역
--migration 파일 생성 및 적용
1. 마이그레이션 파일 (초안) 생성하기 : makemigrations 명령
2. 해당 마이그레이션 파일을 DB에 반영하기 : migrate 명령

-- Migrate (Forward/Backward)
쉘> python manage.py migrate <app-name>
미적용 <마이그레이션 파일> 부터 <최근 마이그레이션 파일> 까지
"Forward 마이그레이션" 이 순차적으로 수행
쉘> python manage.py migrate <app-name> <마이그레이션 파일명>
<지정된 마이그레이션 파일> 이 <현재 적용된 마이그레이션> 보다
이후이면, "Forward 마이그레이션" 이 순차적으로 수행
이전이면, "Backward 마이그레이션" 이 순차적으로 수행 (롤백)
-
전체 파일명을 지정 하지 않더라도, 유일한 1개의 파일명을 판독 가능하면, 파일명 일부로도 지정 가능
blog/migrations/0001_initial.py
blog/migrations/0002_create_field.py
blog/migrations/0002_update_field.py
python manage.py migrate blog 000 # FAIL (다수 파일에 해당)
python manage.py migrate blog 100 # FAIL (해당되는 파일이 없음)
python manage.py migrate blog 0001 # OK
python manage.py migrate blog 0002 # FAIL (다수 파일에 해당)
python manage.py migrate blog 0002_c # OK
python manage.py migrate blog 0002_create # OK
python manage.py migrate blog 0002_update # OK
python manage.py migrate blog zero # blog앱의 모든 마이그레이션을 취소
-- 필수 입력 필드를 추가
-
기존 모델 클래스에 필수 필드를 추가하여 makemigrations 수행
-
필수 입력 필드를 추가하므로, 기존 Row들에 필드를 추가할 때, 어떤 값으로 채워 넣을 지 묻습니다.
선택1) 지금 값을 입력
선택2) 모델 클래스를 수정하여 디폴트 값을 제공
--blog App 작성 : ORM과 쿼리셋(QuerySets)

--QuerySet
1) QuerySet이란?
-
쿼리셋(QuerySet)은 DB로부터 데이터를 인고, 필터링을 하거나, 정렬을 할 수 있습니다.
-
쿼리셋을 사용하기 위해 먼저 python shell을 실행한다.
# 인터렉티브 콘솔(Interactive Console) 실행
Django_src> python manage.py shell
1) 모든 객체 조회하기
모든 객체를 조회하기 위해 all() 함수를 사용합니다.
>>>Post.objects.all()
>>>from blob.models import Post
>>>Post.objects.all()
2) 객체 생성하기
객체를 저장하기 위해 create() 함수를 사용합니다.
작성자(author)로서 User(사용자) 모델의 인스턴스를 가져와 전달 해줘야 합니다.
>>>from django.contrib.auth.models import User
>>>User.objects.all()
>>>me = User.objects.get(username='ola')
>>>Post.objects.create(author=me, title='Sample title', text='Text')
>>>Post.objects.all()
3-1) 필터링 하기
원하는 조건으로 데이터를 필터링 한다. filter() 괄호 안에 원하는 조건을 넣어 주면 됩니다.
# 특정 사용자가 작성한 글을 찾고자 할 때
>>>Posts.objects.filter(author=me)
# 글의 제목(title)에 'title' 이라는 글자가 들어간 글을 찾고자 할 때
>>>Post.objects.filter(title__contains='title')
# 게시일(published_date)로 과거에 작성한 글을 필터링하여 목록을 가져올 때
>>>from django.utils import timezone
>>>Post.objects.filter(published_date__lte=timezone.now())
**lte = less than equal
3-2) 필터링 하기
# 게시(publish)하려는 Post의 인스턴스를 가져온다.
>>>post = Post.objects.get(title="Sample title")
# 가져온 Post 인스턴스를 publish() 메서드를 이용하여 게시한다.
>>>post.publish()
# 게시일(published_date)로 과거에 작성한 글을 필터링하여 목록을 다시 가져온다.
>>>Post.objects.filter(published_date__lte=timezone.now())
4) 정렬 하기
# 작성일(created_date) 기준으로 오름차순으로 정렬하기
>>>Post.objects.order_by('created_date')
# 작성일(created_date) 기준으로 내림차순으로 정렬하기 : – 을 붙이면 내림차슨 정렬
>>>Post.objects.order_by('-created_date')
# 쿼리셋들을 함께 연결(chaining) 하기
>>>Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
**get과 filter의 return type
mypost = Post.objects.filter(title__contains='title')
type(mypost)
>>>django.db.models.query.QuerySet
from django.shortcuts import get_object_or_404
post1 = get_object_or_404(Post,pk=1)
type(post1)
post1.created_date
>>>blog.models.Post
datetime.datetime(2021, 1, 12, 6, 29, 30, tzinfo=<UTC>)
**게시글 지우기
delpost = Post.objects.get(id=3)
delpost.delete()
'CLOUD > Django' 카테고리의 다른 글
1/21 Django - 복습 2차시(with VS Code) (0) | 2021.01.21 |
---|---|
1/20 - Django 복습(with VS Code) (0) | 2021.01.20 |
1/15 Django 4차시 - blog app 만들기(Maria DB, 페이징처리, django REST frame) (0) | 2021.01.15 |
1/14 Django 3차시 - blog app만들기(CRUD + 로그인/로그아웃 + reply) (0) | 2021.01.14 |
1/13 Django 2차시 - blog app만들기(list, detail), css, bootstrap (0) | 2021.01.13 |