-
데이터 테이블 간의 관계를 나타내는 FK, OneToOne, ManyToMany 필드에 대해서 설명하시오
- FK(Foreign Key)
한국어로 외래키 관계, 혹은 일대다(1:N) 관계라고 부릅니다. 외래키는 한 테이블과 다른 테이블간의 관계를 나타내는 개념으로, 외래키로 연결된 다른 테이블의 기본키(Primary Key)를 참조합니다.
예를 들어 한 유저가 여러 개의 게시글을 작성할 수 있을 때, 게시글을 유저와 외래키로 참조합니다. 한 유저는 여러 개의 게시글을 작성할 수 있지만, 한 게시글은 여러 명의 유저를 가질 수 없습니다. 이러한 관계를 FK 관계라고 설명합니다. - OneToOne
한국어로 일대일(1:1) 관계라고 부릅니다. 한 테이블의 레코드가 다른 테이블의 레코드와 1:1로 매핑되는 경우 사용됩니다.
예를 들어 한 유저가 하나의 프로필을 가질 수 있을 때, 유저와 프로필을 OneToOne 관계라고 설명할 수 있습니다. - ManyToMany
한국어로 다대다 관계라고 부릅니다. 이 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 매핑되고, 그 반대도 성립하는 경우에 사용됩니다.
예를 들어 한 유저가 여러 그룹에 속할 수 있고, 한 그룹에 여러 명의 유저가 속할 수 있을때, 이 관계를 ManyToMany 관계라고 설명할 수 있습니다.
Django에서 ManyToMany필드를 만드는 방법에 대해서 설명하시오
Django에서 ManyToMany 관계를 구현하려면, ManyToManyField를 사용하면 됩니다.
먼저 ManyToMany로 연결할 두 모델을 생성합니다.
from django.db import models class User(models.Model): name = models.CharField("이름", max_length=20) age = models.PositiveIntegerField("나이") gender = models.CharField("성별", max_length=10) class Group(models.Model): name = models.CharField("이름", max_length=20)유저와 그룹이라는 모델을 생성했습니다. 한 유저가 여러 그룹에 속할 수 있고, 한 그룹에 여러 유저가 속할 수 있게 하려면 두 모델을 ManyToMany 관계로 엮어야 합니다. 이 때 ManyToManyField를 사용하면 됩니다.
from django.db import models class User(models.Model): name = models.CharField("이름", max_length=20) age = models.PositiveIntegerField("나이") gender = models.CharField("성별", max_length=10) class Group(models.Model): name = models.CharField("이름", max_length=20) users = models.ManyToManyField(User, related_name='user_groups')users라는 속성에 유저를 ManyToManyField를 이용해 MantToMany 관계로 엮었습니다. related_name을 설정하면 유저에서 역참조로 그룹을 불러오는 것이 가능합니다. 이렇게 MantToMany 관계를 구현할 수 있습니다. DB를 확인해보면 users라는 중개 테이블이 자동으로 생성되고 user와 group이라는 칼럼을 갖고 있는 걸 확인할 수 있습니다. 하지만 이 방법은 users라는 테이블에 칼럼을 추가할 수 없습니다.
다른 방법으로는 모델을 하나 더 만들어서 각 모델을 FK로 연결하는 방법이 있습니다.
from django.db import models class User(models.Model): name = models.CharField("이름", max_length=20) age = models.PositiveIntegerField("나이") gender = models.CharField("성별", max_length=10) class Group(models.Model): name = models.CharField("이름", max_length=20) class Participant(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) joined_date = models.DateField("가입일", auto_now_add=True)Participant라는 모델을 만들어서 유저와 그룹을 FK로 연결했습니다. 이렇게 되면 유저와 그룹간의 다대다 관계에 칼럼을 추가할 수 있게 됩니다. 이 때 through를 이용하여 중개 모델을 명시적으로 지정해주는 것도 가능합니다.
from django.db import models class User(models.Model): name = models.CharField("이름", max_length=20) age = models.PositiveIntegerField("나이") gender = models.CharField("성별", max_length=10) class Group(models.Model): name = models.CharField("이름", max_length=20) members = models.ManyToManyField(User, through='Participant') class Participant(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) joined_date = models.DateField("가입일", auto_now_add=True) - FK(Foreign Key)