본문 바로가기
프로그래밍/Django + Python

[Django] Django Model 에 대해서 알아보자

by dev_gyu 2024. 9. 26.
728x90

# Model 이란?

  • Django Framework 에서 데이터베이스와의 상호작용을 관리하는 클래스
  • 모델은 각각이 DB Table 이며 속성을 정의하는 요소인 Field 와 함께 여러 동작 (함수) 를 지니고 있다.
  • Python Django 에서 Model Class 는 django.db.models.Model 의 서브 클래스이다.
  • Django 환경에서 서버 개발을 하는 경우 필수적으로 사용된다.
  • 내부에 Meta class 를 구현하여 Model 에 관한 설정들을 추가 설정할 수 있다.

주요 기능

  • 데이터베이스 테이블 생성 및 관리 : 모델 클래스 정의 시 Django 가 데이터베이스 테이블을 자동으로 생성해준다.
  • ORM 제공 : 모델을 생성 시 SQL 쿼리 작업 필요 없이 Python 코드를 통해 DB Record 작업을 할 수 있게 된다.
  • 데이터 유형 설정 가능 : Field 를 통해 문자열, 숫자, Boolean 등 특정 데이터만 저장할 수 있고 여러 설정이 가능해진다.

 

# Meta class 

  • Model 의 메타데이터를 정의하는 데 사용
  • 모델의 동작 방식을 조정하고 DB 이름, 정렬 순서 등 여러 설정을 할 수 있게 해준다.

내부 속성

• db_table: 데이터베이스 테이블 이름을 지정
• ordering: 쿼리셋의 기본 정렬 순서를 지정
• verbose_name: 모델의 단수형 이름을 지정
• verbose_name_plural: 모델의 복수형 이름을 지정
• unique_together: 특정 필드 조합의 유일성을 보장
• index_together: 특정 필드 조합에 대한 인덱스를 생성
• abstract: 모델을 추상 클래스로 사용
• permissions: 사용자 정의 권한을 추가
• get_latest_by: 최신 객체를 결정할 필드를 지정
• managed: 모델이 Django에 의해 자동으로 관리될지 여부를 지정

예제

class TestModel(models.Model):
    name = models.CharField(default="Test", max_length=30)
    age = models.IntegerField(null=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'custom_table_name' # 테이블 이름을 custom_table_name 으로 변경

 

# Field 란?

  • 데이터베이스에서 테이블의 특정 Column 을 의미한다.
  • 데이터의 Type 을 지정할 수 있으며 Null 허용, 기본값 설정, Unique 설정 등 개발자가 원하는 여러 조건들을 설정해줄 수 있다.
  • 한 모델 내에서 각 Field 의 이름은 중복으로 사용할 수 없다.

Field 의 종류

많은 Field 들이 존재하지만, 자주 사용하는 것들만 우선 나열해보겠다.

• CharField: 고정 길이의 문자열을 저장
• TextField: 가변 길이의 문자열을 저장
• IntegerField: 정수를 저장
• FloatField: 부동 소수점을 저장
• DateField: 날짜를 저장
• DateTimeField: 날짜와 시간을 저장
• EmailField: 이메일 주소를 저장
• BooleanField: 불리언 값을 저장
• ForeignKey: 다른 모델에 대한 외래 키 관계를 저장
• ManyToManyField: 다대다 관계를 저장

# 생성한 모델을 데이터베이스에 적용시키는 법

from django.db import models


class TestModel(models.Model):
    name = models.CharField(default="Test", max_length=30)
    age = models.IntegerField(null=False)
    created_at = models.DateTimeField(auto_now_add=True)

 

위와 같이 models.py 에 모델 클래스를 생성 후 python manage.py makemigrations 를 하면 Django 가 아래와 같이 마이그레이션 파일을 생성해준다.

Django 가 Model 을 토대로 DB Table 을 생성했다는 문장

 

* 만약 no changes .. 나 에러가 나는 경우 Installs Apps 에 [앱].apps.[Config class] 가 지정되어 있는지 확인. 안되어 있다면 추가

 

마이그레이션 파일 생성 후 App - migrations 폴더를 보면 위의 0001_initial.py 파일이 생성된 것을 확인할 수 있을 것이다.

 

Django 가 Model 을 생성했음을 알리는 파일

 

하지만 이렇게 Migrations File 을 생성한 것만으로는 DB 에 Table 이 생성되지 않는다.

우리는 이 파일을 생성하였고 DataBase 에 반영하겠다는 것을 manage.py 를 통해 알려야한다.

다시 다음과 같은 명령어를 입력해주자.

python manage.py migrate

 

정상적으로 작업이 진행되었다면 Applying test.0001_initial... OK 라는 문구가 나왔을 것이다.

이제 마지막으로 Table 이 생성되었는지 확인해보자

그러려면 우선 터미널에 아래 명령어를 입력하여 Shell 에 접속해야한다.

python manage.py shell

 

그 다음 우리가 만든 Model class 를 shell 에 import 해야하므로 아래 명령어도 입력한다

from 앱이름.models import 모델클래스 이름

 

 

마지막으로 Model.objects.all() 을 입력해주면 아래와 같은 문장이 나온다면 DB 에 Table 이 성공적으로 생성된 것이다.

 

만약 데이터베이스에 테이블이 생성되지 않은 경우 아래와 같은 에러가 나오게 된다.

 

 

# Admin 페이지 연동

  1. admin.py 파일을 연다
  2. admin.site.register(모델클래스) 를 등록
  3. python manage.py createsuperuser 를 통해 관리자 생성
  4. python manage.py runserver 를 통해 로컬 서버 실행
  5. 로컬서버주소/admin 에 접속을 하게 되면 아래와 같이 Test models 라는 섹션을 볼 수 있다.

 

만약 데이터를 생성하고 싶은 경우 ADD TEST MODEL 을 클릭하여 데이터를 생성할 수도 있다.

 
 
728x90