Akashic Records

[추가자료] 8.3 웹 프레임워크 - Django Model 본문

Python for Beginners

[추가자료] 8.3 웹 프레임워크 - Django Model

Andrew's Akashic Records 2024. 6. 21. 10:50
728x90

Django

Django의 모델은 웹 애플리케이션의 데이터 구조를 정의하고 데이터베이스와의 상호작용을 처리하는 중요한 부분입니다. 모델은 Python 클래스로 표현되며, Django의 ORM(Object-Relational Mapping)을 통해 데이터베이스의 테이블과 매핑됩니다. 이를 통해 개발자는 복잡한 SQL 쿼리를 작성하지 않고도 데이터베이스를 효율적으로 관리할 수 있습니다.

기본 구조

모델은 django.db.models.Model 클래스를 상속받아 정의됩니다. 모델의 각 속성은 데이터베이스 테이블의 필드를 나타내며, Django에서 제공하는 필드 타입을 사용하여 선언합니다.

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publish_date = models.DateField()
    isbn_number = models.CharField(max_length=13)
    page_count = models.IntegerField()
    cover_image = models.ImageField(upload_to='covers/')
    available = models.BooleanField(default=True)

필드 타입

모델에서 사용할 수 있는 다양한 필드 타입이 있습니다:

  • CharField: 문자열 필드, max_length 파라미터가 필요합니다.
  • IntegerField, DecimalField, FloatField: 정수, 소수, 부동 소수점 숫자를 저장합니다.
  • DateField, DateTimeField: 날짜와 시간 정보를 저장합니다.
  • EmailField: 이메일 주소를 검증하는 문자열 필드입니다.
  • FileField, ImageField: 파일 또는 이미지를 저장할 때 사용됩니다.
  • BooleanField: True/False 값을 저장합니다.

관계 필드

복잡한 데이터베이스 구조를 지원하기 위해 Django는 관계 필드도 제공합니다:

  • ForeignKey: 다대일 관계를 구현합니다.
  • ManyToManyField: 다대다 관계를 구현합니다.
  • OneToOneField: 일대일 관계를 구현합니다.
class Author(models.Model):
    name = models.CharField(max_length=100)
    bio = models.TextField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publish_date = models.DateField()

모델 메서드

모델에 메서드를 추가하여 인스턴스의 동작을 사용자 정의할 수 있습니다. 예를 들어, 모델 인스턴스의 문자열 표현을 정의하는 __str__ 메서드를 자주 사용합니다.

class Book(models.Model):
    title = models.CharField(max_length=100)

    def __str__(self):
        return self.title

Django의 모델은 강력하면서도 유연한 데이터 관리를 지원하여 복잡한 데이터베이스 구조도 쉽게 다룰 수 있게 해줍니다. 이러한 모델 시스템은 Django 웹 애플리케이션의 데이터 핵심을 구성하며, 애플리케이션 로직과 밀접하게 연결되어 있습니다.

Meta 클래스

Django 모델의 Meta 클래스는 모델에 대한 다양한 메타데이터를 정의하는 데 사용됩니다. 이 메타 데이터는 모델의 동작 방식을 커스터마이징하고, 데이터베이스 수준에서의 동작, 관리자 인터페이스에서의 표현 등을 세밀하게 조정할 수 있게 도와줍니다. 여기에는 정렬 방법, 테이블 이름, 모델 권한, 추상 모델 설정 등이 포함됩니다.

db_table

  • 모델에 대응하는 데이터베이스 테이블의 이름을 직접 지정합니다. 지정하지 않을 경우 Django는 자동으로 <app_label>_<model_name> 형식의 이름을 사용합니다.
class MyModel(models.Model):
    class Meta:
        db_table = 'my_custom_table'

ordering

  • 데이터베이스에서 객체를 조회할 때의 기본 정렬 순서를 지정합니다. 이 옵션은 모델의 리스트를 반환할 때 적용되며, 문자열 리스트로 필드명을 지정하며, 필드명 앞에 -를 붙이면 내림차순 정렬을 의미합니다.
class MyModel(models.Model):
    class Meta:
        ordering = ['name', '-date_created']

verbose_nameverbose_name_plural

  • 모델의 단수형과 복수형 이름을 지정합니다. 이 이름들은 Django의 관리자 인터페이스에서 사용됩니다.
class MyModel(models.Model):
    class Meta:
        verbose_name = "Profile"
        verbose_name_plural = "Profiles"

permissions

  • 사용자 정의 권한을 모델에 추가합니다. 이것은 특히 사용자가 관리자 인터페이스를 통해 특정 작업을 수행할 수 있도록 할 때 유용합니다.
class MyModel(models.Model):
    class Meta:
        permissions = (
            ("view_history", "Can view history"),
            ("close_project", "Can close project"),
        )

unique_togetherindex_together

  • unique_together는 두 개 이상의 필드에 대해 유니크 제약 조건을 설정합니다.
  • index_together는 두 개 이상의 필드에 대한 인덱스를 생성합니다. 이는 데이터베이스의 조회 성능을 향상시킬 수 있습니다.
class MyModel(models.Model):
    class Meta:
        unique_together = (('field1', 'field2'),)
        index_together = (('field1', 'field2'),)

abstract

  • 추상 기본 클래스를 지정합니다. 이 메타 옵션을 True로 설정하면, 해당 모델은 데이터베이스 테이블을 생성하지 않고, 다른 모델들이 상속받아 사용할 수 있는 "베이스 모델"로만 사용됩니다.
class MyBaseModel(models.Model):
    class Meta:
        abstract = True

이러한 Meta 옵션들은 모델을 더 효율적으로 관리하고, 애플리케이션의 요구사항에 맞게 데이터베이스 테이블을 최적화하며, 사용자 경험을 개선하는 데 중요한 역할을 합니다. Django에서 모델의 메타 데이터를 적절히 활용하는 것은 강력하고 유연한 애플리케이션 설계의 핵심 요소 중 하나입니다.

마이그레이션 관리

모델을 변경한 후에는 마이그레이션을 통해 데이터베이스 스키마를 업데이트해야 합니다.

  • 마이그레이션 생성: 모델 변경 후 python manage.py makemigrations를 실행하여 마이그레이션 파일을 생성합니다.
  • 마이그레이션 적용: python manage.py migrate를 실행하여 변경사항을 데이터베이스에 적용합니다.

Django의 모델은 데이터베이스 스키마의 추상화로서 Python 클래스를 사용해 정의됩니다. 이 클래스들은 Django의 ORM을 통해 데이터베이스 테이블로 변환됩니다. 모델을 구성하는 기본 구조와 문법에 대해 자세히 알아보겠습니다.

데이터베이스 설정

Django에서는 다양한 데이터베이스 시스템을 지원하며, 각 데이터베이스에 모델을 적용하는 방법은 대체로 비슷합니다. 여기서는 Django에서 가장 널리 사용되는 데이터베이스—SQLite, PostgreSQL, MySQL, Oracle—에 모델을 적용하는 기본적인 설정과 절차를 알아보겠습니다.

 

Django 프로젝트의 settings.py 파일에서 DATABASES 설정을 통해 데이터베이스를 설정할 수 있습니다. 기본적으로 Django는 SQLite를 사용합니다.

SQLite

SQLite는 설정이 가장 간단하며, 개발 초기 단계에서 많이 사용됩니다. 기본 설정은 다음과 같습니다:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

PostgreSQL

PostgreSQL은 생산 환경에서 많이 사용되는 강력한 오픈 소스 데이터베이스입니다. Django에서 사용하기 위해서는 psycopg2 패키지가 필요합니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

MySQL

MySQL을 사용하기 위해서는 mysqlclient 라이브러리를 설치해야 합니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

Oracle

Oracle 데이터베이스를 사용하려면 cx_Oracle 라이브러리가 필요합니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '',
        'PORT': '',
    }
}

2. 마이그레이션 수행

모델을 데이터베이스에 적용하기 위해서는 마이그레이션을 생성하고 적용해야 합니다.

# 마이그레이션 파일 생성
python manage.py makemigrations

# 데이터베이스에 마이그레이션 적용
python manage.py migrate

주의사항

각 데이터베이스에 맞는 특정 설정(문자 집합, 타임존, 연결 설정 등)이 필요할 수 있습니다. 또한, 성능 최적화와 관련된 추가 설정을 고려할 수도 있습니다.

728x90
Comments