본문 바로가기

Programming/Django

[01. Django] 008. ORM

728x90

Django ORM(Object-Relational Mapping)은 Django 프레임워크의 핵심 구성 요소 중 하나로, 데이터베이스와 상호 작용하는 고급 API를 제공한다. ORM을 통해 개발자는 SQL 쿼리를 작성하지 않고도 데이터베이스에서 데이터를 생성, 조회, 업데이트, 삭제할 수 있다. Django ORM은 Python 클래스를 데이터베이스 테이블로 매핑하여 객체 지향 방식으로 데이터베이스 작업을 수행한다.

 

주요 특징 및 개념을 소개하면 다음과 같다.

 

1. 모델(Model) 정의

Django ORM의 모델은 데이터베이스 테이블을 정의하는 클래스다. 모델 클래스는 데이터베이스 필드를 나타내는 여러 필드(attribute)를 가질 수 있다.

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

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

 

Django는 다양한 필드 타입을 제공하며, 각 필드는 특정 데이터 유형을 나타낸다. 주요 데이터 타입들을 아래와 같다.

 

문자열 및 텍스트 관련 필드

# CharField: 짧은 문자열을 저장할 때 사용. max_length 속성을 지정해야 한다.
name = models.CharField(max_length=100)

# TextField: 긴 텍스트를 저장할 때 사용. max_length 없이 사용할 수 있다.
description = models.TextField()

 

숫자 관련 필드

# IntegerField: 정수를 저장할 때 사용.
age = models.IntegerField()

# FloatField: 부동 소수점 숫자를 저장할 때 사용.
price = models.FloatField()

# DecimalField: 고정 소수점 숫자를 저장할 때 사용. max_digits와 decimal_places 속성 지정 필요.
salary = models.DecimalField(max_digits=10, decimal_places=2)

 

날짜 및 시간 관련 필드

# DateField: 날짜를 저장할 때 사용.
birth_date = models.DateField()

# TimeField: 시간을 저장할 때 사용.
start_time = models.TimeField()

# DateTimeField: 날짜와 시간을 함께 저장할 때 사용.
created_at = models.DateTimeField()

 

Boolean 필드

# BooleanField: 참/거짓 값을 저장할 때 사용.
is_active = models.BooleanField()

 

파일 및 이미지 관련 필드

# FileField: 파일을 업로드하고 저장할 때 사용.
file = models.FileField(upload_to='uploads/')

# ImageField: 이미지를 업로드하고 저장할 때 사용. Pillow 라이브러리가 필요.
image = models.ImageField(upload_to='images/')

 

기타 필드

# EmailField: 이메일 주소를 저장할 때 사용.
email = models.EmailField()

# URLField: URL을 저장할 때 사용.
website = models.URLField()

# UUIDField: 고유 식별자(UUID)를 저장할 때 사용.
unique_id = models.UUIDField()

# JSONField: JSON 형식의 데이터를 저장할 때 사용.
data = models.JSONField()

 

관계 필드

# ForeignKey: 다른 모델과의 일대다 관계를 정의할 때 사용.
author = models.ForeignKey(Author, on_delete=models.CASCADE)

# ManyToManyField: 다른 모델과의 다대다 관계를 정의할 때 사용.
categories = models.ManyToManyField(Category)

# OneToOneField: 다른 모델과의 일대일 관계를 정의할 때 사용.
profile = models.OneToOneField(Profile, on_delete=models.CASCADE)

 

이 외에도 다양한 필드 타입들이 있다.

 

2. 데이터베이스 마이그레이션(Migration)

모델이 정의되면 이를 데이터베이스 테이블로 변환하기 위해 마이그레이션을 생성하고 적용한다.

 

python manage.py makemigrations

python manage.py migrate

 

3. 쿼리셋(QuerySet)

Django ORM은 데이터베이스 쿼리의 결과를 쿼리셋 객체로 반환한다. 쿼리셋은 데이터베이스 레코드의 리스트와 유사하며, 다양한 쿼리 메서드를 체인으로 연결하여 사용할 수 있다.

# 모든 책 조회
books = Book.objects.all()

# 특정 조건의 책 조회
books_by_author = Book.objects.filter(author__name="John Doe")

# 책 한 권 조회
book = Book.objects.get(id=1)

# 책의 제목 업데이트
book.title = "New Title"
book.save()

# 책 삭제
book.delete()

 

4. 모델 인스턴스 생성

모델 인스턴스를 생성하여 데이터베이스에 레코드를 추가할 수 있다.

author = Author(name="John Doe", email="john@example.com")
author.save()

book = Book(title="Django ORM Guide", author=author, published_date="2023-01-01")
book.save()

 

5. 관계 설정

Django ORM은 모델 간의 관계를 쉽게 설정할 수 있다. ForeignKey, ManyToManyField, OneToOneField를 사용하여 모델 간의 관계를 정의한다.

 

ForeignKey는 일대다 관계를 정의할 때 사용된다. 하나의 객체가 여러 다른 객체와 연결될 때 사용된다.

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

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

 

주요 속성을 설명하면 다음과 같다.

1) to: 참조할 모델 (위 예에서는 Author)

2) on_delete: 참조된 객체가 삭제될 때 수행할 동작

3) CASCADE: 참조된 객체가 삭제될 때 이를 참조하는 객체도 삭제

4) PROTECT: 참조된 객체가 삭제되지 않도록 방지

5) SET_NULL: 참조된 객체가 삭제될 때 외래 키를 NULL로 설정 (필드는 null=True여야 함)

6) SET_DEFAULT: 참조된 객체가 삭제될 때 외래 키를 기본값으로 설정

7) DO_NOTHING: 아무 작업도 하지 않음

 

# Author가 삭제될 때 해당 Author를 참조하는 모든 Book 객체도 삭제됨
author = Author.objects.create(name="John Doe", email="john@example.com")
book = Book.objects.create(title="Django Basics", author=author, published_date="2023-01-01")
author.delete()  # 이때 book 객체도 삭제됨

 

ManyToManyField는 다대다 관계를 정의할 때 사용된다. 여러 객체가 여러 다른 객체와 연결될 때 사용된다.

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)

class Course(models.Model):
    title = models.CharField(max_length=100)
    students = models.ManyToManyField(Student)

 

주요 속성을 설명하면 다음과 같다.

1) to: 참조할 모델 (위 예에서는 Student)

2) related_name: 역참조할 때 사용할 이름

3) through: 중개 모델을 사용할 경우 지정

student1 = Student.objects.create(name="Alice")
student2 = Student.objects.create(name="Bob")
course = Course.objects.create(title="Django Course")

# 학생들을 코스에 등록
course.students.add(student1, student2)

# 코스에 등록된 학생들 조회
students_in_course = course.students.all() #[<Student: Alice>, <Student: Bob>]

# 특정 학생이 등록된 코스 조회
courses_of_student1 = student1.course_set.all() #[<Course: Django Course>]

 

OneToOneField는 일대일 관계를 정의할 때 사용된다. 하나의 객체가 오직 하나의 다른 객체와 연결될 때 사용된다.

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()

 

주요 속성을 설명하면 다음과 같다.

1) to: 참조할 모델 (위 예에서는 User)

2) related_name: 역참조할 때 사용할 이름

user = User.objects.create(username="johndoe", email="john@example.com")
profile = Profile.objects.create(user=user, bio="Software Developer")

# 프로필을 통해 사용자 정보 조회
user_of_profile = profile.user  # <User: johndoe>

# 사용자 정보를 통해 프로필 조회
profile_of_user = user.profile  # <Profile: Software Developer>

# User가 삭제될 때 Profile도 함께 삭제됨
user.delete()  # 이때 profile 객체도 삭제됨

 

요약하면 다음과 같다.

ForeignKey: 일대다 관계, 예) 한 저자가 여러 책을 가질 수 있음.

ManyToManyField: 다대다 관계, 예) 여러 학생이 여러 과목을 수강할 수 있음.

OneToOneField: 일대일 관계, 예) 한 사용자가 하나의 프로필을 가질 수 있음.

 

이들 필드는 Django의 ORM을 통해 데이터베이스 관계를 간단하고 직관적으로 정의할 수 있게 도와준다. 각각의 필드를 적절히 사용하여 모델 간의 관계를 효과적으로 설정할 수 있다.

 

6. 관리자 인터페이스(Admin Interface)

Django는 기본적으로 관리 인터페이스를 제공한다. 이를 통해 데이터베이스 모델을 쉽게 관리할 수 있다.

from django.contrib import admin
from .models import Author, Book

class Author_Admin(admin.ModelAdmin):
    list_display = ('name', 'email') # 관리자 페이지에 표시할 필드
    search_fields = ('name', 'email') # 검색할 필드
    list_filter = ('name', 'email') # 필터할 필드
    list_display_links = ('name', 'email')  # 클릭할 수 있는 열

admin.site.register(Author)
admin.site.register(Book)

 

7. 폼(Form)과 유효성 검사(Validation)

Django ORM은 데이터 입력 및 유효성 검사를 위한 폼을 지원한다. 

from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'published_date']

 

 

DBMS를 연동 했으니 아래 코드로 한 번 실습해보자. models.py에 아래와 같은 코드를 작성한다.

 

class IPO_Items(models.Model):
    code = models.CharField(max_length=20)
    name = models.CharField(max_length=255)
    category1 = models.CharField(max_length=50)
    category2 = models.CharField(max_length=50) 
    item = models.CharField(max_length=50)
    item_sub = models.CharField(max_length=50) 
    value = models.CharField(max_length=50) 
    date = models.DateField()
    updated_time = models.DateTimeField(auto_now_add=True)

 

python manage.py makemigrations 로 변경사항을 저장하고

python manage.py migrate 로 테이블을 생성한다.

 

[그림 1.5] 생성된 테이블

 

연결된 DB에 해당 테이블이 생성된 것을 확인할 수 있다.

728x90

'Programming > Django' 카테고리의 다른 글

[01. Django] 010. 데이터 요청/응답(Frontend ↔ Backend)  (0) 2024.11.27
[01. Django] 009. MTV  (0) 2024.11.26
[01. Django] 007. ADMIN  (0) 2024.08.07
[01. Django] 006. DBMS연동  (0) 2024.07.28
[01. Django] 005. APP생성  (0) 2024.07.13