Search

Model

데이터베이스에 저장되는 데이터를 의미
DB 작업을 가능하게 해주는 ORM 제공
ORM(Object-Relational Mapping) : SQL이라는 언어 대신 데이터베이스를 쉽게 연결해주는 방법.

Field Type

ID

import uuid from django.db import models # Create your models here. class UserModel(models.Model): id = models.UUIDField(help_text="Unique key", primary_key=True, default=uuid.uuid4, editable=False)
Python
복사

문자열

from django.db import models # Create your models here. class UserModel(models.Model): email = models.EmailField(help_text="User E-mail", blank=False, null=False) name = models.CharField(help_text="User Full Name", max_length=255, blank=False, null=False)
Python
복사

데이터

from django.db import models # Create your models here. class UserModel(models.Model): age = models.PositiveIntegerField(help_text="User Age", blank=False, null=False)
Python
복사

날짜 및 시간

from django.db import models # Create your models here. class UserModel(models.Model): created_date = models.DateTimeField(help_text="Created Date time", auto_now_add=True) updated_date = models.DateTimeField(help_text="Updated Date time", auto_now=True)
Python
복사

관계

from django.db import models class Manufacturer(models.Model): # ... pass class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE) # ...
Python
복사

Field Option

import uuid from django.db import models # Create your models here. class UserModel(models.Model): id = models.UUIDField(help_text="Unique key", primary_key=True, default=uuid.uuid4, editable=False) email = models.EmailField(help_text="User E-mail", blank=False, null=False) name = models.CharField(help_text="User Full Name", max_length=255, blank=False, null=False) age = models.PositiveIntegerField(help_text="User Age", blank=False, null=False) created_date = models.DateTimeField(help_text="Created Date time", auto_now_add=True) updated_date = models.DateTimeField(help_text="Updated Date time", auto_now=True)
Python
복사

Meta Option

메타(Meta) 클래스는 모델 내부에서 사용할 수 있는 설정을 적용
정렬 순서나 관리 설정 등을 변경할 수 있다.
import uuid from django.db import models # Create your models here. class UserModel(models.Model): id = models.UUIDField(help_text="Unique key", primary_key=True, default=uuid.uuid4, editable=False) email = models.EmailField(help_text="User E-mail", blank=False, null=False) name = models.CharField(help_text="User Full Name", max_length=255, blank=False, null=False) age = models.PositiveIntegerField(help_text="User Age", blank=False, null=False) created_date = models.DateTimeField(help_text="Created Date time", auto_now_add=True) updated_date = models.DateTimeField(help_text="Updated Date time", auto_now=True) class Meta: verbose_name = "유저 정보" verbose_name_plural = "유저 정보" # name은 내림차순, age는 오름차순으로 정렬 ordering = ["-name", "age"]
Python
복사

Model Attributes

우리가 Django 에서 해당 모델의 데이터베이스 모든 데이터를 조회할때에는, 아래와 같이 ORM 을 작성
이때 사용되는, objects가 Manager의 기본 이름
<model명>.objects.all()
from django.db import models class Student(models.Model): name = models.CharField(max_length=50, verbose_name='학생 이름')
Python
복사
위의 Student 모델이 있다고 가정할 때에, 해당 모델의 데이터베이스를 조회하는 명령어들은 아래와 같습니다.
Student.objects.all() # Student 의 모든 객체를 조회 Student.objects.get(name='장고쟁이') # 이름이 장고쟁이인 Student 를 찾음
Python
복사

Model Methods

모델 클래스에는, 사용자 정의 메서드를 추가할 수 있다. (row-level, 즉, 줄 단위)
Manager 메서드 (objects) 는, table 전체에 적용되고. 모델 메서드들은, 특정한 모델 인스턴스에 적용된다.
해당 모델의 인스턴스에 대해서, 특별한 비지니스 로직을 동작하고 싶을때에, 이런 모델 메서드를 사용해서. 하나의 모델에 모아놓고 사용할수 있다.
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) birth_date = models.DateField() def baby_boomer_status(self): # "Returns the person's baby-boomer status. " # 해당 사람이, baby_boomer 세대인지 아닌지 판단합니다. import datetime if self.birth_date < datetime.datetime(1945, 8, 1): return "Pre-boomer" elif self.birth_date < datetime.datetime(1965, 1, 1): return "Baby boomer" else: return "Post-boomer" @propertydef full_name(self): # "Returns the person's full name" # 해당 사람의 이름을 리턴합니다 return '%s %s' % (self.first_name, self.last_name)
Python
복사
In [1]: import datetime In [2]: colin = Person.objects.create(first_name="Colin", last_name="Firth", birth_date=datetime.date(1960, 9, 10)) In [3]: colin.first_name Out[3]: 'Colin' In [4]: colin.last_name Out[4]: 'Firth' In [5]: colin.birth_date Out[5]: datetime.date(1960, 9, 10) In [6]: colin.baby_boomer_status Out[6]: <bound method Person.baby_boomer_status of <Person: Person object (4)>> In [7]: colin.full_name # @property로 인하여 메서드를 필드처럼 사용됨 Out[7]: 'Colin Firth'
Python
복사

Model Method Overriding

from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def save(self, *args, **kwargs): if self.name == "Yoko One's blog": return # 블로그 이름이 "Yoko One's blog" 이면, save 가 호출 되지 않고 # 비어있는값이 return 됩니다 # "Yoko One's blog" 가 제목이 아닐경우, else 로 넘어갑니다. else: super().save(*args, **kwargs) # 실제 save()를 호출해서 save() 진행
Python
복사