저번 포스트에서 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 |
댓글