본문 바로가기
Web Programming/django

[Django] 모델 관계 (2)

by 테리는당근을좋아해 2020. 6. 21.

저번 포스트에서 1:n 관계를 맺는 방법에 대한 글을 썼다.

이번 글을 Django에서 1:1, 1:n, n:m의 관계를 맺는 예시이다.

 

1:1 관계

1:1 관계는 OneToOneField를 이용해 표현할 수 있다

OneToOneField는 ForeignKey에 Unique 속성을 True로 준 것과 동일하게 작동한다

 

class 모델이름(models.Model):
    필드이름 = models.OneToOneField(관계대상모델)

1:1 관계를 표현하는 기본적인 방법을 위와 같다.

 

class Husband(models.Model):
    name = models.CharField(max_lenght=10)
    age = models.IntegerFiled(default=0, blank=Ture, null=True)

class Wife(models.Model):
    husband = models.OneToOneFiled(Husband)
    name = models.CharField(max_lenght=10)
    age = models.IntegerFiled(default=0, blank=Ture, null=True)

남편과 아내를 예로 든 모델이다

 

 

 

1:n 관계

1:n 관계는 ForiegnKeyField를 이용해 표현할 수 있다.

 

class 모델이름(models.Model):
    필드이름 = models.ForeignKey(연결대상모델, on_delete=삭제옵션)

1:n 관계를 표현하는 기본적인 방법을 위와 같다.

 

class Post(models.Model):
    title = models.CharFiled(max_length=30)
    pub_date = models.DateTimeField('date published')
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
    pub_date = models.DateTimeField('date published')
    cotent = models.TextField()

 

게시글과 게시글에 달린 댓글을 관계로 든 모델이다.

 

 

 

n:m 관계

n:m 관계 ManyToManyField를 이용해 표현할 수 있다.

 

class 모델이름(models.Model):
    필드이름 = models.ManyToManyField(연결대상모델)

n:m 관계를 표현하는 기본적인 방법을 위와 같다.

 

class Crew(models.Model):
    name = models.CharField(max_lenght=30)
    NumOfStudent = models.IntegerField()

class Student(models.Model):
    crews = models.ManyToManyField(Crew)
    name = models.CharField(max_lenght=30)
    number = models.IntegerField()

동아리와 학생의 관계를 든 모델이다.

 

관계형 데이터베이스는 논리적으로는 다대다를 표현할 수 있지만, 실제로는 매핑테이블을 사용하게 된다.

위의 예는 다대다 관계를 표현하기 위해 장고 ORM에서 기본적으로 제공하는 ManyToManyField를 사용한 방식이다.

 

 

매핑테이블을 이용하는 방법

class Crew(models.Model):
    name = models.CharField(max_lenght=30)
    NumOfStudent = models.IntegerField()

class Student(models.Model):
    join = models.ManyToManyField(Crew, through='Join')
    name = models.CharField(max_lenght=30)
    number = models.IntegerField()

class Join(models.Model):
    crew = models.ForeignKey(Crew, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)

위의 예는 매핑 테이블을 이용한 방식

'Web Programming > django' 카테고리의 다른 글

[Django] 이미지 업로드  (13) 2020.06.21
[Django] 정적파일  (1) 2020.06.21
[Django] 모델 관계 (1)  (0) 2020.06.21
[Django] 회원가입 기능 만들기  (5) 2020.06.20
[Django] CRUD Operation(5)  (2) 2020.06.20

댓글