티스토리 뷰

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
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함