상세 컨텐츠

본문 제목

장고 모델 필드

django

by 개복신 개발자 2022. 3. 31. 18:51

본문

728x90
반응형

기본 지원되는 모델필드 타입

레퍼런스 참조-->

https://docs.djangoproject.com/en/3.0/ref/models/fields/#field-types

 

Model field reference | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

그리고 다양한 커스텀 필드들

django-model-utils: https://django-model-utils.readthedocs.io/en/latest/ 

 

django-model-utils — django-model-utils 4.2.0.post14+g02bd67c documentation

© Copyright 2015, Carl Meyer Revision 02bd67cf.

django-model-utils.readthedocs.io


모델 필드들은 DB 필드타입을 반영

 

-DB에서 지원되는 필드들을 반영

Varchar 필드타입 -> charField, slugField, URLField, EmailField

 

파이썬 데이터타입과 데이터베이스 데이터타입을 매핑

AutoField -> int

BinaryField -> bytes

BooleanField -> bool

CharField/SlugField/URLField/EmailField -> str

 

같은 모델 필드라 할지라도 DB에 따라 다른 타입이 될 수 있다

 


validators(유효성 검사) 수행할 함수 다수 지정

from django.conf import settings
from django.db import models

class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
blog_url = models.URLField(blank=True)

class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(allow_unicode=True, db_index=True) # ModelAdmin.prepopulated_fields 편리
desc = models.TextField(blank=True)
image = models.ImageField(blank=True) # Pillow 설치가 필요
comment_count = models.PositiveIntegerField(default=0)
tag_set = models.ManyToManyField('Tag', blank=True)
is_publish = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Comment(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)

-n:1의 관계를 다룰 때 n의 입장에서 ForeignKey를 작성

comment 테이블과 Post 테이블은 n:1의 관계이다. 포스트 안에 여러개의 댓글이 있기 때문이다.

따라서 post = models.ForeignKey(Post, on_delete=models.CASCADE) 코드 작성!

 

반면에 Profile 테이블은 사용자와 일대일 관계이기 때문에 OneToOneField를 사용

 

-comment_count(댓글 수) 

PositiveInteagerField 사용-> 댓글 개수는 음수일 수 없기 때문에

default=0으로 두어서 기본값 지정

 

-tag_set 다수의 태그가 들어올 숭 ㅣㅆ음

ManyToManyField 사용


설계한 데이터베이스 구조에 따라 최대한 필드타입을 타이트하게 지정해주는 것이 입력값 오류를

막을 수 있음

-blank/null 지정은 최소화

-validators들은 타이트하게 지정

-백엔드에서의 유효성 검사는 필수

-직접 유효성 로직 만들면 안됨

 

보다 성능 높게 설계하기 위해 데이터베이스 이해

 

 

 

반응형

'django' 카테고리의 다른 글

DRF 개념  (0) 2022.08.08
장고 admin을 통한 데이터 관리  (0) 2022.04.05
장고 orm  (0) 2022.03.31
웹 프레임워크  (0) 2022.03.28
detail 페이지 오답노트  (0) 2022.03.21

관련글 더보기

댓글 영역