TIL 27 | Django Model

임종성·2021년 7월 22일
1

Django

목록 보기
8/17
post-thumbnail

Django Model은 Database와 Object Relational Mapping 하며 자동으로 연동되어 필요한 Database 연산을 처리할 수 있도록 한다. Model과 View를 구현하며 C.R.U.D Flow를 이해하는 과정에서, Django Model의 특징과 Field, Method 개념을 더 알아보고 싶어 Django Doc를 읽어봤다.

Model

Model은 우리가 CRUD하는 Data들에 대한 필수 filed와 behavior를 포함하며, 우리가 만든 Model을 토대로 Database가 구성된다. 각각의 Model은 django.db.models.Model 의 subclass인 Python Class이고, Model의 각 속성은 Database에서의 Table과 Mapping된다.

Basic Feature


from django.db import models

class Movie(models.Model):
    title = models.CharField(max_length=100)
    release_date = models.DateTimeField()
    running_time = models.IntegerField(default=0)
  • title, release_date, running_time는 모두 Model의 Field들이다.
  • 각 Field는 class attribute이며, 이 attribute는 database의 column들과 맵핑된다.
  • Database의 Table은 자동으로 AppName_ClassName 형식으로 저장되지만, Class Metadb_table을 사용하여 원하는 이름으로 지정할 수 있다.
from django.db import models

class Movie(models.Model):
    ~~~
    ~~~
    
    class Meta:
    	db_table = 'movies'   

Field

Model에서 필수적이고 가장 중요한 것이 바로 Field 이다. 지금까지 단순하게 IntegerField, CharField등 기본적인 Field들만 사용했는데, 더 사용할만한 다양한 Field Type과 기능들을 구체적으로 알아보자.

Field Type

PositiveIntergerField

PositiveIntegerField는 0에서 2147483647까지의 value를 저장할 수 있는 Field다. IntergerField는 -2147483648 to 2147483647 사이의 값을 저장할 수 있지만, 관리하는 Data가 양의 정수만 포함한다면 차지하는 메모리가 적은 PositiveIntegerField를 사용하는 것이 효율적이다.

DateField

class DateField(auto_now=False, auto_now_add=False, **options)

Python의 Datetime.Date Instance를 가지며, 선택적 argument를 가지고있다.

  • DateField.auto_now
    Field가 저장될 때마다 자동으로 현재시간으로 지정한다. QuerySet.update()로는 변경되지 않으며, 오로지 Models.save()를 통해 적용된다.

  • DateField.auto_now_add
    오로지 Field가 Create될때 현재시간으로 지정한다. 만약 DateField 값을 변경하고 싶다면 auto_now_add = True를 사용하지 않고 Default를 사용하는 것이 좋다.
    default = date.today or default = timezone.now for DateTimeField

  • auto_now, auto_now_add, Default상호 배타적(Mutually Exclusive)이므로 한 번에 하나의 옵션만 사용해야 한다.

DecimalField

class DecimalField(max_digits=None, decimal_places=None, **options)

소수점 숫자를 표현하기 위해 사용하는 Field이다. 2개의 Required Argument를 가지고 있다.

  • max_digits
    숫자가 가질 수 있는 최대 Digit을 설정한다. 이는 decimal_places보다 커야 한다.
  • decimal_places
    숫자의 소수점 아래 자리 수를 설정한다.

예를 들어 소수점 2자리까지 표현하는 1000 이하의 수를 DecimalField로 표현하고 싶다면 다음과 같은 argument를 사용한다,.

models.DecimalField(..., max_digit = 5, decimal_places = 2)

그 외에 다양한 Field가 있고, 직접 Model를 구현할 때 필요하다면 Django Documentation을 찾아보자.

Field Options

Field Type을 보면 각 Field는 고유 argument들을 가지는데, DecimalField처럼 필수 argument를 가지거나 DateField처럼 optional argument들을 가지고 있다. 이 외에 어떤 argument가 있을까?

모든 Field에 통용되는 Common Argument 들을 살펴보자.

null

NULL=True라면 Database에 Empty Value인 Null을 저장할 수 있고, Default 값은 False이다.

blank

blank=True라면 Field는 저장된 value없이 빈 상태로 존재할 수 있게 되고, Default는 False다. 만약 blnk=False면 Field는 필수적으로 data를 담아야 한다.

primary_key

기본적으로 모든 Fieldprimary_key=True가 없다면 Modeld의 primary_key는 BigAutoField를 가진 id로 지정된다.

Django에서 자동으로 primary key를 지정해주는데 왜 굳이 primary key를 지정해야 할까? 고민을 해봤는데 Defualt인 primary key는 BigAutoField이기에 일정 이상으로 data가 쌓이면(1 to 9223372036854775807..) 더 이상 기능을 하지 못하게 되기 때문인 것 같다.

그 외 option의 구체적인 기능을 보려면 Django의 Common Model Field Option를 살펴보자.

profile
어디를 가든 마음을 다해 가자

0개의 댓글