당신은 멋쟁이, 우리는 장고쟁이~

0%

Django Models 7편 - Relationships (Many-to-one)

Models - Relationships (Many-to-one)



확실히, 관계형 데이터베이스의 장점은, 테이블들끼리 관계를 생성하는데에서 옵니다.


관계형 데이터베이스란?

데이터베이스계의 주류로,

데이터를 로우 (Row:행, 줄) 과 컬럼 (Column: 열, 칸) 이라는 일종의 표 형태로 저장하고,

데이터의 종속성은 관계 (Relation) 으로 표현한다.

한 테이블에 있는 모든 로우는 같은 길이의 컬럼을 가지고 있으며, 이 컬럼의 구조와 데이터의 관계가 테이블 스키마 (Schema) 로 사전 정의 된다.



Django 는 가장 공통적인 relational database 3가지를 지원합니다.


  • many-to-one (1:M, 1 대 다수)

  • many-to-many (M:M, 다수 대 다수)

  • one-to-one (1:1, 일 대 일 )


Many-to-one relationships


다수 : 1 혹은 1: 다수 관계를 정의하기 위해서는, django.db.models.ForeignKey 를 사용합니다.

모델내에 클래스 속성으로 다른 필드 타입을 사용하는것과 비슷하게 사용할수 있습니다.


ForeignKey 는 위치 인자를 필수적으로 필요로 합니다

ForeignKey 를 사용하면, 다른 모델과 해당 필드에 관계를 만들어 놓을수 있습니다.

ForeignKey 를 사용할때에는, 위치인자에 관계를 만들고 싶은 다른 class 이름을 넣어줍니다.


예를들면,


1
2
3
4
5
6
7
8
9
10
11
12
from django.db import models

class Manufuacturer(models.Model):
# ...
pass


class Car(models.Model):
# 여러대의 Car 는 1개의 Manufacturuer 를 가집니다
# ForeginKey 를 사용해서, 이 관계를 모델링 해줄수 있습니다.
# 위의 Manufacturer 클래스를 소문자화한 이름으로 필드명을 짓는것이 권장 됩니다.
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)

  • Car 모델은 하나의 Manufacturer 를 가집니다
  • 하나의 Manufacturer (브랜드 공장) 은 여러개의 자동차를 생산합니다
  • 하지만, 각 자동차는 하나의 Manufacturer 만 가질수 있습니다
  • 다수 : 1 의 데이터베이스 관계를 성립하여, ForeignKey 를 이용해 위의 예시처럼 정의해주었습니다.

또한, 재귀적인 관계를 생성할수도 있습니다 (many-to-one 관계를 스스로 갖는 객체)


필수는 아니지만, 권장되는 사항은, ForeignKey 필드 이름은 해당 모델의 소문자로 표현하는게 좋습니다.


하지만, 당연히 필드명은 우리가 원하는데로 지을수 있습니다.


1
2
3
4
5
class Car(models.Model):
company_that_makes_it = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)

# 필드명을 company_that_makes_it 으로, 사용자가 사용하기 편하게 지어줬습니다
# 하지만, 이 필드명은 Manufacturer 의 소문자 형태인 manufacturer 로 짓는것이 권장됩니다.

예시


1
2
3
4
5
6
class Dev_Department(models.Model):
team = models.CharField(max_length=40)

class Dev_Staff(models.Model):
name = models.CharField(max_length=40, verbose_name="직원이름")
department = models.ForeignKey(Dev_Department, on_delete=models.CASCADE)

  • 개발 조직에 있는 하나의 팀에는, 여러명의 직원이 소속될수 있습니다
  • Dev_Staff 는, 직원의 이름과 부서 팀을 정의합니다. ForeignKey 를 사용하여, Dev_Department 와 관계를 가지게 정의되었습니다.