•
데이터베이스에 저장되는 데이터를 의미
•
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
복사