Django Model

MoonLight·2021년 8월 3일
0

django

목록 보기
13/20
post-thumbnail

Django Model


  • 모델은 다음과 같은 3가지 개념이 있다.
    • 데이터의 구조
    • 데이터베이스
    • 소통

I. 데이터의 구조


  • 우리가 저장할 정보들의 형태
  • 이 형태, 즉, 각각의 데이터 구조와 형식을 지정하는 것을 데이터모델링이라고 한다.
    • 만들고자하는 서비스의 요구사항에 맞게 데이터의 구조를 짜는 것
      • 아래는 코스토랑이라는 프로젝트에 맞게 Menu의 데이터 형식을 알맞게 조정한다.


II. 데이터베이스


  • 실제로 데이터를 저장하는 곳
  • 대표적인 데이터베이스는 다음과 같다.
  • 보통은 이러한 데이터베이스에다가 SQL을 이용하여 Create, Read, Update, Delete를 수행한다.
  • 하지만, Django에는 SQL을 사용하지 않는다. 아래를 보자.

III. 소통


  • 장고는 SQL이 아닌 파이썬을 이용하여 데이터와 소통할 수 있도록 해주는 도구를 이용한다.
    • 이를 ORM이라고 한다.
  • Django에서는 바로 Model.py가 ORM기능을 제공한다.

IV. 흐름 이해하기


1. 서비스의 요구사항에 맞게 데이터를 모델에 정리하고(데이터 모델링을 하고),,

2. 아래와 같은 python code를 작성하면, django는 아! 이러한 형식으로 데이터를 저장하는 구나! 하고 django가 인식하여 자동으로 그에 맞는 SQL코드를 수행 및 데이터베이스에 저장.

3. 아래와 같은 python code를 작성하면 그에 맞는 SQL코드를 생성한 다음, 실행해서 원하는 데이터를 데이터베이스로부터 읽어온다.


V. 모델 작성 실습


  • 코스토랑은 음식에 대한 모델 객체가 필요하다. 그렇다면 데이터구조와 형식을 어떻게 지정해주어야 할지 데이터베이스 모델링을 해보자.
  • 아래 views.py를 보면 음식이름/설명/가격/이미지경로가 있다. 그렇다면 음식이름/설명/이미지경로는 문자열 형식으로 지정하고, 가격은 숫자형으로 지정하면 될 것 같다.
### views.py

def food_detail(request, food):
    context = dict()
    if food == 'chicken':
        context['name'] = '코딩에 빠진 닭'
        context['description'] = '주머니가 가벼운 당신의 마음까지 생각한 가격!'
        context['price'] = 10000
        context['img_path'] = 'foods/images/chicken.jpg'
    else:
        raise Http404('이런 음식은 없다구요!')
    return render(request, 'foods/detail.html', context)

이제 ORM기능을 해주는 models.py를 작성해보자.

  • 아래 Menu class의 인자에 models.Model을 써주었는데 이유는 부모클래스로 부터 상속을 받아서 구현해야하기 때문이다.
  • models는 장고에서 제공하는 클래스이다. 점(.) 연산자를 통하여 내부에 접근한다.
  • 각각의 데이터형식을 Field라고 하는데 CharField는 문자열 최대길이를 필수인자로 써주어야한다.
### models.py

from django.db import models

# Create your models here.
class Menu(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=100)
    price = models.IntegerField()
    img_path = models.CharField(max_length=255)
    
    def __str__(self):
        return self.name

장고에서 제공하는 필드는 여러 종류가 있는데, 이는 part. VI 를 참고.

  • 이렇게 모델작업을 마치면 장고가 모델을 인식하게끔 알려주어야 한다.
    - 모델을 생성및 변경하기 위한 명령어
    python manage.py makemigrations
    - 우리가 만든 앱과 더불어 장고에서 미리 제공해주는 여러 데이터 구조들이 함께 반영
    python manage.py migrate

migration에 대해서는 나중에 다루겠다.


VI. Model Field


💬 Django Model은 대부분의 데이터를 저장할 수 있는 필드(Field)를 지원하는데 모든 필드에 사용할 수 있는 공통 옵션이 있고, 각각의 필드마다 가지고 있는 고유 옵션이 있다. 여기서는 자주 사용할 만한 몇 가지 필드와 옵션을 살펴보겠다.

📜 필드(Field)

  • 필드(Field)는 데이터 테이블에서의 열(column), 즉 데이터의 속성을 의미

0x01. CharField

class CharField(max_length=None)
  • 제한된 길이의 문자열을 위한 필드
  • max_length 는 필수 인수이며 입력할 최대 길이를 설정

0x02. IntegerField

class IntegerField()
  • 정수 값을 위한 필드이며 -2147483648 부터 2147483647 범위를 지원

0x03. BooleanField

class BooleanField()
  • Boolean 값을 위한 필드

0x04. DateField

class DateField(auto_now=False, auto_now_add=False)
  • DateField는 파이썬의 datetime.date 객체 형태로 표시되는 날짜 필드
    • auto_now : true로 설정되면 해당 객체가 변경(save) 될 때마다 자동으로 필드 값을 지금으로 수정함. '마지막 수정 시간' 같은 항목으로 사용하면 좋다.
    • auto_now_add : 모델이 처음 생성될 때 한 번, 자동으로 필드 값을 지금으로 설정. '생성된 시간'을 저장하기 위해 많이 사용

0x05. DateTimeField

class DateTimeField(auto_now=False, auto_now_add=False)
  • 파이썬의 datetime.datetime 객체 형태로 표시되는 날짜 필드
  • DateField와 인수 옵션은 같음

0x06. EmailField

class EmailField(max_length=254)
  • CharField의 하위 클래스로 문자열이 이용 가능한 이메일 주소인지 EmailValidator를 통해 확인

0x07. FileField

class FileField(upload_to=None, max_length=100)
  • 파일 업로드를 위한 필드
  • upload_to : 업로드될 경로를 지정하는 필드로 Storage.save() 함수로 값이 전달되어 저장

0x08. ImageField

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)
  • FileField를 상속하여 구현되는 파일 업로드를 위한 필드이며 기본적으로 최대 길이가 100인 문자열 형식으로 생성
  • 위에서 나왔던 FileField에서 업로드된 파일이 정상적인 이미지 파일인지 확인하는 과정이 추가된 필드로 이미지 처리를 위한 Pillow 라이브러리가 필수적으로 필요
  • height_field & width_field 객체가 저장 될 때 이미지의 높이와 너비값이 자동으로 채워짐.

이 밖에도 IP 주소를 체크를 하는 GenericIPAddressField, JSON 파일을 위한 JSONField (django 3.1 버전 이상부터 지원) 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 위한 URLField 등 다양한 필드가 있다.
다음 공식 문서를 참고
( https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default )

✅ 옵션(Option)

  • 아래 옵션은 모든 필드 타입에 사용할 수 있으며 선택적으로 적용할 수 있다.

0x01. null

Field.null
  • 기본 값은 False이며 Null 값 허용 여부를 선택한다.

만약에, 이 null 옵션을 적용할 필드가 문자열 기반 필드 (Char, Text) 일 경우에는 주의해서 사용해야 하는데 ' ' (빈 문자열)과 Null 모두 해당 필드의 데이터가 없다는 것을 의미하기 때문이다. 일반적으로 데이터가 없다는 것을 의미하는 값은 하나여야 하므로 Django는 문자열 기반 필드가 데이터가 없음을 표시할 때는 ' '(빈 문자열)을 사용하도록 권장하고 있다.

0x02. blank

Field.blank
  • 기본 값은 False이며 True로 설정한 경우 필드 값을 빈 값으로 설정할 수 있다.

그렇다면 null과 blank의 차이는 무엇일까?
null은 온전히 데이터베이스와 관련된 사항이고 blank는 데이터의 유효성 검사와 관련된 옵션이다. 예를들어 blank가 True라면 해당 필드에 데이터를 입력하지 않아도 유효성 검사를 통과하게 된다.

0x03. default

Field.default
  • 필드의 기본값을 설정하는 옵션으로 값 또는 함수가 들어갈 수 있다.

0x04. db_column

Field.db_column
  • 해당 필드에 사용할 데이터베이스 속성 명을 지정한다. 따로 지정하지 않을 경우 일반적으로 필드의 이름을 사용한다.

더 많은 필드와 옵션에 대해 알고 싶다면 아래 django 공식 문서를 참고.
https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default

profile
hello world :)

0개의 댓글