[DB] Django Model

이상해씨·2023년 12월 20일
0

장고 (Django)

목록 보기
31/38
post-custom-banner

데이터 베이스 모델 간의 관계

테이블 간 관계를 맞을 수 있다!

  • 1 : N
    : 하나의 테이블에 여러개의 테이블과의 관계. 예를 들어 게시판과 댓글의 관계
  • N : M
    : 여러개의 테이블과 여러개의 테이블의 관계.
  • 1 : 1
    : 하나의 테이블에 하나의 테이블이 매칭되는 구조.

📌 Django에서 model을 통한 관계를 표시할 때 양방향으로 정의가 필요할 것 같지만, 한쪽 클래스에서만 관계를 정의하면 됨!

Django에서 여러 데이터 모델 관계 생성하기

1:N 관계, 외래키 설정하기

  • 학과:학생의 관계 (한 학과에 여러 학생이 존재)

    (출처 - 위니브 장고 강의자료 노션)
  • 외래키(Foreign Key, FK)
    : 외부에서 참조하여 가져온 키. 학생 개체가 학과 개체의 PK 값을 참조
  • Django에서는 1 : N의 관계를 정의하기 위해 ForeignKey를 사용
  • ForeignKey 필드는 1에 정의하는 것이 아니라 N에 정의
from django.db import models

# 학생
class Student(models.Model):
    number = models.IntegerField("학번")
    name = models.CharField("이름", max_length=20)
    major = models.ForeignKey(verbose_name="주전공", to='e.Department', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.name


# 학과
class Department(models.Model):
    name = models.CharField("학과명", max_length=20)
    head = models.CharField("학과장", max_length=20)

    def __str__(self):
        return self.name

on_delete옵션은 연결된 객체가 삭제될 경우 현재 객체를 어떻게 처리할지 묻는 값

  • CASCADE : 연결된 객체가 삭제되면 해당 객체도 함께 삭제 (상속된 객체도 삭제하는 옵션)
  • PROTECT : 해당 객체가 있다면 연결된 객체가 삭제되지 않음 (연결된 객체에는 영향을 미치지 않음)
  • SET : 연결된 객체만 삭제하고, 해당 객체는 지정하고 있는 값으로 설정
  • SET_DEFAULT : 연결된 객체만 삭제하고, 해당 객체는 기본 값으로 설정
  • SET_NULL : 연결된 객체만 삭제하고, 해당 객체는 None값으로 설정
  • DO_NOTHING : 아무것도 하지 않음

N:M 관계, 중계테이블 생성하기

  • 학생한명과 친구들과의 관계 (학생 한 명에 여러 명의 친구)

(출처 - 위니브 장고 강의자료 노션)

  • N:M 관계에서는 중계 테이블이 필수
    : 한 속성에는 하나의 값만 들어갈 수 있기 때문
from django.db import models

# 학생
class Student(models.Model):
    number = models.IntegerField("학번")
    name = models.CharField("이름", max_length=20)
    major = models.ForeignKey(verbose_name="주전공", to='e.Department', on_delete=models.SET_NULL, null=True)
    friends = models.ManyToManyField(verbose_name="친구들", to='self', db_table='e_friendship', blank=True)

    def __str__(self):
        return self.name
  • Django의 ManyToManyField를 이용해 쉽게 N:M 관계를 구현
  • 관계를 명시할 뿐 실제 DB에는 Student 테이블에 friends라는 속성이 생겨나지 않음.
    : 그 대신 e_friendship이라는 중계 테이블이 생성되고 학생의 pk를 참조하는 두 개의 외래키를 가짐

📌 두 테이블 모두 ManyToMany 필드를 가지고 있어서는 안됨

  • admin에서 확인해보기
from django.contrib import admin
from .models import Student, Department

admin.site.register(Student)
admin.site.register(Department)

1:1 관계

  • 1:1 관계는 OneToOneField로 표현
  • ForeignKey에서 unique=True 옵션을 준 것과 유사
from django.db import models

# 학생
class Student(models.Model):
    number = models.IntegerField("학번")
    name = models.CharField("이름", max_length=20)
    major = models.ForeignKey(verbose_name="주전공", to='e.Department', on_delete=models.SET_NULL, null=True)
    friends = models.ManyToManyField(verbose_name="친구들", to='self', db_table='e_friendship', blank=True)
    card = models.OneToOneField(Student, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class StudentCard(models.Model):
    studentCardID = models.IntegerField()

    def __str__(self):
        return self.studentCardID 

본 글은 아래 자료를 참고하여 작성됨

profile
공부에는 끝이 없다
post-custom-banner

0개의 댓글