Django models 정리

개발자 강세영·2022년 5월 7일
1

TIL

목록 보기
19/65

사진에 나온 코드는 고양이라는 데이터를 모델의 클래스 형태로 정의한 것이다
모델을 마이그레이션 하기 전에 settings.py 의 INSTALLED_APPS 리스트에 앱 이름을 추가해줘야한다
위 코드를 마이그레이션하면 장고에 연결된 DBMS에 SQL을 통해 cat 테이블이 생성된다
모델의 클래스를 만들때 클래스 이름은 단수형만 쓰는게 좋다

Fields

모델에서 가장 중요한 부분이다.
위 코드의 클래스 안의 name, weight_g 와 같은 변수를 모델의 fields라고 한다
각 필드는 각자의 속성을 가지며 해당되는 테이블의 컬럼과 같다.
Django에선 모델 클래스를 만들때 따로 필드에 id라는걸 넣지 않아도 자동으로 PK, auto-increment한 id 테이블(AutoField)을 만들어준다. 기본 설정이고 원하지 않는다면 바꿀 수 있다.
테이블의 컬럼에 들어갈 데이터의 유형과 테이블들간의 관계(1대1, 1대다, 다대다) 그리고 기타 다른 설정값들도 넣을 수 있다.
또한 서로다른 앱 간의 models.py에서 서로 자유롭게 import 할수있다.

주요 Field Types

  • AutoField, BooleanField, CharField, DateTimeField, FileField, ImageField,TextField, URLField, UUIDField

주요 Relationship Types

  • ForeignKey, ManyToManyField, OneToOneField

필드 간의 관계설정 문법

  • 1대1 관계는 models.OneToOneField(클래스이름, 옵션)
  • 1대다 관계는 models.ForeignKey(클래스이름, on_delete 등 옵션)
  • 다대다 관계는 models.ManyToManyField(클래스이름, 옵션)
  • 중간 테이블을 따로 만들지 않아도 ManyToManyField를 쓰면 자동으로 두 테이블 이름을 _으로 연결한 중간 테이블이 생성된다 이런걸 through model이라고 한다

필드명 제한

  • 필드명으로 clean,save,delete 등을 쓰면 Django Model API와 충돌할수있으므로 안 쓰는게 좋다.
  • 필드명으로 "pass", foo__bar 같이 언더라인이 두개 들어간것, 필드명 마지막이 언더라인으로 끝나는것은 쓸수없게 되어있다.

모델 클래스 안의

class Meta:
	db_table = 'drink_categories'
  • class Meta: 로 테이블의 내용과는 상관없지만 테이블의 이름 등 여러가지 메타데이터를 정의할수있다
  • db_table 변수를 만들면 이 변수의 값이 테이블명이 된다. 이렇게 따로 정의하지 않으면 클래스 이름이 그대로 테이블 이름이 된다
  • 모델클래스 상속을 위해 abstract = True 옵션을 활용할 수 있다.

모델 클래스 안의 매직 메서드 정의

def __str__(self):  
	return self.name

이 코드를 넣으면 장고 shell에서 객체가 아니라 테이블의 name으로 표시된다 관리자 페이지를 사용한다면 관리자 페이지에서도 name이 뜨게 된다.

다음과 같이 모델 간 상속도 가능하다

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()
    
	class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

주요 Field Option

필드옵션 : 필드마다 고유 옵션이 존재, 공통 적용 옵션도 있음

  • null (DB 옵션) : DB 필드에 NULL 값 허용 여부 (디폴트 : False)
  • unique (DB 옵션) : 유일성 여부 (디폴트 : False)
  • blank : 입력값 유효성 (validation) 검사 시에 empty 값 허용 여부 (디폴트 : False)
  • default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용
  • verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐
  • validators : 입력값 유효성 검사를 수행할 함수를 다수 지정
    각 필드마다 고유한 validators 들이 이미 등록되어있기도 함
    예 : 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한 등
  • choices (form widget 용) : select box 소스로 사용
  • help_text (form widget 용) : 필드 입력 도움말
  • auto_now_add : Bool, True 인 경우, 레코드 생성시 현재 시간으로 자동 저장
  • auto_now : True면 데이터를 수정할때 현재 시간으로 자동저장됨

여러 models.py 파일 관리

프로젝트를 시작하고 앱도 많이 만들다 보면 models.py 파일들을 관리하는게 어려울 수 있는데
최상단 폴더에 따로 models 폴더를만들고 그안에 __init__.py파일을 만들어주고 앱 이름마다 모델파일을 만들어주고 __init__.py파일에서 임포트하는 식으로 관리하면 좋다.
마찬가지로 views나 template 파일들도 비슷하게 관리할 수 있다.

0개의 댓글