[Django] App Model과 ORM

Inah-_-·2021년 3월 3일
0

Django

목록 보기
2/8

스타벅스ERD모델링에 이어서

Django Model🚥

데이터베이스 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'



ORM이란🎨

Object Relational Mapping = 객체-관계 매핑
객체와 관계형DB의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
객체 지향 프로그래밍(python...)은 클래스를 사용하고, 관계형DB는 table을 사용하는데,
이 객체 model과 관계형 model간에 불일치가 존재하게 된다.

이 불일치를 해결하는게 ORM으로, 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주어
객체를 통해 간접적으로 데이터베이스의 데이터를 다룰 수 있게 한다.


Model Fields🏞

데이터베이스에 데이터를 저장할 때 각 레코드의 타입을 결정할 수 있다.
Django에서 필드는 모델을 생성할 때 필수적인 요소로,
model class의 속성으로 나타낸다.

Field Type

CharField

제한된 문자열 필드 타입으로 최대 길이를 max_length 옵션에 지정

class User(models.Model):
     name = models.CharField(max_lengh=45)

EmailField

CharField의 파생클래스로, 이메일 주소 체크

class User(models.Model):
     email = models.EmailField()

GenericIPAddressField

CharField의 파생클래스로, IP 주소를 체크

class User(models.Model):
     address = models.GenericIPAddressField()

URLField

URL 표현

class User(models.Model):
     sitelink = models.URLField()

TextField

대용량 문자열을 갖는 필드

class User(models.Model):
     userself = models.TextField()

IntegerField

32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 사용

class User(models.Model):
     integer = models.IntegerField()

BooleanField

True/False 필드

class User(models.Model):
     boolean = models.BooleanField()

NullBooleanField

Null을 허용

class User(models.Model):
     nullboolean = models.NullBooleanField()

DateField

날짜를 갖는 필드

class User(models.Model):
     date_of_birth = models.DateField()

TimeField

시간을 갖는 필드

class User(models.Model):
     clock = models.TimeField()

DateTimeField

날짜와 시간을 모두를 갖는 필드

class User(models.Model):
     date_of_birth_clock = models.DateTimeField()

DecimalField

소숫점을 갖는 decimal 필드

class User(models.Model):
     clock = models.TimeField()

BinaryField

바이너리 데이터를 저장하는 필드
바이너리란? (생소한 단어라서 찾아봄)
.jpg,.png,.mp3,.exe 등의 파일들이 바이너리 파일에 해당된다.
바이너리 파일은 사용자 또는 프로그램이 사용하던 정보나 숫자 값을
가공없이 순수하게 그대로 파일에 저장한다.

대부분의 데이터를 크기로 판단한다. 예를들어
"나 배고픈데 뭐 먹지?"가 아닌 "나 아이스크림 먹을래"가 바이너리 파일이다.

class User(models.Model):
     nary = models.BinaryField()

FileField

파일 업로드 필드

class User(models.Model):
     upload = models.FileField()

ImageField

FileField의 파생클래스로, 이미지 파일인지 체크

class User(models.Model):
     image = models.ImageField()


관계 정의 필드🌗🌓

PrimaryKey(기본키)

Data-Table에 있는 유일하게 구분되는 Data-Key, 중복값 x

ForignKey

외래키, 다른 테이블의 레코드와 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 tableuserUser class를 참조한다.

ForeignKey Options

OnDelete

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)

OnUpdate

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)

ManytoManyField

필드가 대상 테이블과 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)

OneToOneField

필드가 대상 테이블과 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'



정리에 도움된 Reference

정규화_제1~제3정규화
django

profile
Backend Developer

0개의 댓글