티스토리 뷰
Model
- View 함수에서 Database에 작업을 요청할 때 SQL 구문이 필요
SQL (Structured Query Language)
• Query : 정보 수집에 대한 요청에 쓰이는 컴퓨터 언어
• SQL : 관계형 데이터베이스 관리 시스템 (Relational Database Management System) 의 데이터를 관리 위한 프로그래밍 언어
• RDBMS 종류 : PostgreSQL, MySQL, MariaDB 등
• 장고 모델은 RDBMS만을 지원
• 장고 모델을 통해 SQL을 생성/실행
Django Model
• Django 내장 ORM
• SQL을 직접 작성하지 않아도, 장고 모델을 통해 데이터베이스로의 접근 (조회/추가/수정/삭제)
• (중요) SQL을 몰라도 된다는 것은 아님. 최소한 내가 짠 코드가 어떤 SQL을 만들어내는 지는 검증해야함.
• <파이썬 클래스> 와 <데이터베이스 테이블> 을 매핑
• Model : DB 테이블과 매핑
• Model Instance : DB 테이블의 1 Row
Django Model
커스텀 모델 정의 (특정앱/models.py)
데이터베이스 테이블 구조/타입을 먼저 설계를 한 다음에 모델 정의
모델 클래스명은 단수형 (Posts가 아니라, Post)
from django.db import models class Post(models.Model): # Post라는 모델을 생성 한다. title = models.CharField(max_length=100) # 100글자 길이 제한이 있는 문자열 content = models.TextField() # 길이 제한이 없는 문자열 created_at = models.DateTimeField(auto_now_add=True) # 생성시 현재 시간 자동 저장 updated_at = models.DateTimeField(auto_now=True) # 수정시 현재 시간 자동 저장 |
(참고) 자주 사용되는 모델 필드 타입
Filed Types : AutoField, BooleanFiled, CharField, DateTimeField, FileFireld, ImageField, TextField
Realation Ship Types : ForeignKey, ManyToManyField, OneToOneField
자주 사용되는 필드 옵션
• 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 용) : 필드 입력 도움말
• chocies (from widget 용) : select box로 값 사용
모델 작성 예제
import re from django.db import models from django.forms import ValidationError from django.utils import timezone def lnglat_validator(value): # 정규표현식을 통해, 경도/위도 포맷을 지정한다. if not re.match(r'^(\d+\.?\d*),(\d+\.?\d*)$', value): raise ValidationError('Invalid LngLat Type') # 유효성에 맞지 않는 경우 "Invalid LngLat Type"을 출력한다. class Post(models.Model): STATUE_CHOICE = ( ('상태1', '상태1 레이블'), ('상태2', '상태 2레이블'), title = models.CharField(max_length=100, verbose_name='제목') # 필드 레이블을 지정한다. ex( title > 제목으로 표시) content = models.TextField(help_text='Markdown 문법을 써주세요.') # 어떤 값을 입력해야되는지 도와주는 문구 표시 tags = models.CharField(max_length=100, blank=True) # 공백을 허용 함 lnglat = models.CharField(max_length=50, validators=[lnglat_validator],help_text='경도,위도 포맷으로 입력') # 유효성을 검사한다. status = models.CharField(max_length=1, choices=STATUS_CHOICE) # STATUS_CHOICE에 항목을 선택 하도록 한다. created_at = models.DateTimeField(default=timezone.now) test_field = models.IntegerField(default=10) |
모델 등록 절차
# 1. models.py에서 모델 클래스를 정의 한다. # 2. shell에서 migrations, migrate를 진행 한다. > python3 manage.py makemigratoons [앱 명] ## 앱 명을 지정하지 않으면 전체 앱 적용 (참고) 해당 명령어를 실행 하면 /프로젝트/앱/migration/ 디렉토리에 파일이 생성되며 해당 파일 확인 시 진행되는 작업에 대한 내용 확인 가능 필히 확인하자. (migrate 이전에 해당파일은 삭제해도 무관하다. 다시 makemigrations 해주자!) # 3. migrations완료 이후 migrate를 진행한다. > python3 manage.py migrate [앱 명] ## 앱 명을 지정하지 않으면 전체 앱 적용 # 4. 어드민페이지에 등록 한다. # 앱 명/admin.py from django.contrib import admin from django.utils.safestring import mark_safe from .models import Post # 생성한 모델 클래스 등록 admin.site.register(Post) (참고) 4번 작업을 통해 admin 페이지에서 Post 모델클레스 관리가 가능해진다. |
"""본 내용은 AskDjango VOD, "장고 차근차근 시작하기" 강의내용을 참고하여 작성했습니다.(https://nomade.kr/)"""
'Python > * Django' 카테고리의 다른 글
6. Django Admin (0) | 2017.12.12 |
---|---|
5. Migration (0) | 2017.12.12 |
3. View Overview (0) | 2017.12.12 |
2. URL Conf 및 정규표현식 (1) | 2017.12.11 |
1. Django App, URLconf, Template (0) | 2017.12.11 |