티스토리 뷰

django 에서 테이블 간 관계를 맺을 수 있다.

테이블 간 관계를 맺을 때 유의할 점은 관계는 원래 양방향 개념이지만 장고에선 한쪽 클래스에서 관계를 정의해주면 상대편 정의는 자동으로 정의가 된다. 또한 한쪽 방향으로 관계를 생성/변경 할 경우 반대방향으로도 관계가 변하게 된다.

테이블 간의 관계는 3가지가 있으며 1:N , N:N , 1:1 관계로 분류된다.


1:N

N 모델 클래스에서 foreignKey 필드 정의한다. 인자는 1 모델이다. 

class Customer(models.Model):
    name = models.CharField(max_length=20)
class order(models.Model):
    customer = models.ForeignKey(User,null=True) # 1:N 관계 정의
    product = models.CharField(max_length=100)

고객은 여러번의 주문을 할 수 있으므로 1:N 관계가 성립된다.

1:N 관계에서 1 객체를 지우게 되면 CASCADE로 동작하여 N쪽의 객체도 삭제된다.


N:N

관계를 맺고자 하는 모델 중 한쪽에 ManyToManyField 필드를 정의한다. 

class People(models.Model): 
    name = models.CharField(max_length=20)
class Hover(models.Model):
    name = models.CharField(max_length=30)
    people = models.ManyToManyField(People) # N:N 관계 정의

사람은 여러개의 취미를 가지며 같은 취미를 여러사람들이 가지고 있으므로 N:N 관계가 성립된다.

연결되어있는 두 객체중 하나의 객체를 지워도 다른 객체는 지워지지 않는다.


1:1

관계를 맺고자 하는 모델 중 한쪽에 OneToOneField 필드를 정의한다.

class Place(models.Model):
    name = models.CharField(max_length=20)
class Shop(models.Model):
    name = models.CharField(max_length=20)
    place = models.OneToOneField(Place) # 1:1 관계 정의

한 장소에는 하나의 식당이 존재하고 한 개의 식당은 하나의 장소에 위치하기 때문에 1:1 관계가 성립된다.



관계 매니저

모델 간 관계에 대한 기능 및 데이터베이스 쿼리를 담당하는 클래스이다.

관계 매니저는 객체들의 집합을 다루는 클래스이기 때문에 1:n , n:n 관계에서 사용된다.

customer.order_set

order_set는 관계 매니저 클래스의 객체이다 


order.customer 

N에서 1을 액세스 할때는 대상 객체가 1개이므로 관계매니저를 사용하지 않는다.


 

댓글