데이터베이스 table과 Python의 class는 1:1로 매핑되며
model의 class명은 단수형으로 지정해야 한다. ex)User (O), Users(x)
models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_lengh=45)
email = models.EmailField()
image = models.URLField()
데이터베이스에서 보여질 table의 class명을 Meta
클래스로 지정해줄 수 있다.
models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_lengh=45)
email = models.EmailField()
image = models.ImageField()
class Meta:
db_table = 'users'
Object Relational Mapping = 객체-관계 매핑
객체와 관계형DB의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
객체 지향 프로그래밍(python...)은 클래스를 사용하고, 관계형DB는 table을 사용하는데,
이 객체 model과 관계형 model간에 불일치가 존재하게 된다.
이 불일치를 해결하는게 ORM으로, 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주어
객체를 통해 간접적으로 데이터베이스의 데이터를 다룰 수 있게 한다.
데이터베이스에 데이터를 저장할 때 각 레코드의 타입을 결정할 수 있다.
Django
에서 필드는 모델을 생성할 때 필수적인 요소로,
model class
의 속성으로 나타낸다.
제한된 문자열 필드 타입으로 최대 길이를 max_length 옵션에 지정
class User(models.Model):
name = models.CharField(max_lengh=45)
CharField의 파생클래스로, 이메일 주소 체크
class User(models.Model):
email = models.EmailField()
CharField의 파생클래스로, IP 주소를 체크
class User(models.Model):
address = models.GenericIPAddressField()
URL 표현
class User(models.Model):
sitelink = models.URLField()
대용량 문자열을 갖는 필드
class User(models.Model):
userself = models.TextField()
32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 사용
class User(models.Model):
integer = models.IntegerField()
True/False 필드
class User(models.Model):
boolean = models.BooleanField()
Null을 허용
class User(models.Model):
nullboolean = models.NullBooleanField()
날짜를 갖는 필드
class User(models.Model):
date_of_birth = models.DateField()
시간을 갖는 필드
class User(models.Model):
clock = models.TimeField()
날짜와 시간을 모두를 갖는 필드
class User(models.Model):
date_of_birth_clock = models.DateTimeField()
소숫점을 갖는 decimal 필드
class User(models.Model):
clock = models.TimeField()
바이너리 데이터를 저장하는 필드
바이너리란? (생소한 단어라서 찾아봄)
.jpg
,.png
,.mp3
,.exe
등의 파일들이 바이너리 파일에 해당된다.
바이너리 파일은 사용자 또는 프로그램이 사용하던 정보나 숫자 값을
가공없이 순수하게 그대로 파일에 저장한다.
대부분의 데이터를 크기로 판단한다. 예를들어
"나 배고픈데 뭐 먹지?"가 아닌 "나 아이스크림 먹을래"가 바이너리 파일이다.
class User(models.Model):
nary = models.BinaryField()
파일 업로드 필드
class User(models.Model):
upload = models.FileField()
FileField의 파생클래스로, 이미지 파일인지 체크
class User(models.Model):
image = models.ImageField()
Data-Table에 있는 유일하게 구분되는 Data-Key, 중복값 x
외래키, 다른 테이블의 레코드와 1:N 관계 형성
models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_lengh=45)
email = models.EmailField()
image = models.ImageField()
class Meta:
db_table = 'users'
class Dog(models.Model):
user = models.ForeignKey(on_delete=CASCADE)
name = models.CharField(max_length=20)
breed = models.CharField(max_length=50)
age = models.IntegerField()
class Meta:
db_table = 'dogs'
Dog table
의 user
가 User class
를 참조한다.
class Dog(models.Model):
user = models.ForeignKey(on_delete=CASCADE)
name = models.CharField(max_length=20)
breed = models.CharField(max_length=50)
age = models.IntegerField()
class Meta:
db_table = 'dogs'
Cascade : 부모 데이터 삭제 시 자식 데이터도 삭제
user = models.ForeignKey(On_Delete=CASCADE)
Set null : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Null로 업데이트
user = models.ForeignKey(On_Delete=SET NULL)
Set default : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
user = models.ForeignKey(On_Delete=SET DEFAULT)
Restrict : 자식 테이블이 참조하고 있을 경우, 데이터 삭제 불가
user = models.ForeignKey(On_Delete=SET RESTRICT)
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
user = models.ForeignKey(On_Delete=NO ACTION)
Cascade : 부모 데이터 업데이트 시 자식 데이터도 업데이트
user = models.ForeignKey(On_Update=CASCADE)
Set null : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Null로 업데이트
user = models.ForeignKey(On_Update=SET NULL)
Set default : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
user = models.ForeignKey(On_Update=SET DEFAULT)
Restrict : 자식 테이블이 참조하고 있을 경우, 업데이트 불가
user = models.ForeignKey(On_Update=RESTRICT)
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
user = models.ForeignKey(On_Update=NO ACTION)
필드가 대상 테이블과 N:N 관계가 되도록 설정한다.
관계 설정 대상이 되는 모델을 필수로 설정
models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_lengh=45)
email = models.EmailField()
image = models.ImageField()
class Meta:
db_table = 'users'
class Dog(models.Model):
users = models.ManytoManyField(User, through='House')
name = models.CharField(max_length=20)
breed = models.CharField(max_length=50)
age = models.IntegerField()
class Meta:
db_table = 'dogs'
class House(models.Model):
user = models.ForeignKey(User, on_delete=CASCADE)
dog = models.ForeignKey(Dog, on_delete=CASCADE)
필드가 대상 테이블과 1:1 관계를 형성
models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_lengh=45)
email = models.EmailField()
image = models.ImageField()
class Meta:
db_table = 'users'
class Dog(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=20)
breed = models.CharField(max_length=50)
age = models.IntegerField()
class Meta:
db_table = 'dogs'