본문 바로가기
개발/Django_python 웹 프레임워크

Django 모델 - 1:1, 1:N, N:M

by 자유로운 코끼리 2020. 8. 4.
728x90

1:N

1:N관계의 예시 중 하나는 '게시물과 유저'를 들 수 있습니다.

한명의 유저가 여러개의 게시물을 만들 수 있으니까요.

 

from django.contrib.auth.models import User

class Post(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE, related_name='users')
    title = models.CharField(max_length=200)

User

ID username
1 eun
2 bi
3 ki

Post

ID title user_id
1 오늘은 그랬쥬 1
2 내일은~~ 1
3 냠냠 2

 

이때 Post는 user_id 값을 통해 user에 접근할 수 있지만,

User는 post 객체에 접근할 수 없겠죠?

 

이째 필요한 것이 역참조(역관계)입니다. 

쟝고에는 _set으로 접근을 할 수 있습니다.

me =User.objects.get(id=1)
me.post_set.all()

이 뿐만 아니라 models에서 realated_name 속성을 사용해 접근할 수 있는데요.

me.users.all()

 

1:1

한 테이블의 하나의 레코드가 다른 테이블의 단 하나의 레코드만을 참조할 때를 의미합니다.

class Profile(models.Model):
	user = models.OneToOneField(User, on_delete=models.CASCADE)

1:1 관계일 때는 서로가 서로뿐이니 참조할 때, 다음곽 같이 할 수 있습니다.

user.profile
profile.user

 

N:M

하나의 테이블의 하나 이상의 레코드가 다른 테이블의 하나 이상의 레코드를 참조하는 것을 말합니다.

예를 들어 좋아요 기능을 구현한다고 하면, 유저는 여러개의 게시물에 좋아요를 누를 수 있고, 게시물의 좋아요는 여러 유저를 받을 수 있는, 이런 것을 N:M 관계라합니다.

 

from django.contrib.auth.models import User

class Post(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=200)

    like = models.ManyToManyField(User, blank=True)

이렇게 관계형 데이터베이스를 만들게 되면,

오류가 나게 됩니다.

왜냐하면 User.post_set으로 접근을 할 때

user와 like 변수 중 어떤 것을 기준으로 참조해야할지 user가 알 수 없기 때문입니다.

 

from django.contrib.auth.models import User

class Post(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE, related_name='users')
    title = models.CharField(max_length=200)

    like = models.ManyToManyField(User, related_name='likes',blank=True)

이렇게 줘야 User.likes로 접근할 수 있게 되는거죠...!:>

 

이때 다대다 관계를 표현할 때,

두 테이블 사이의 관계를 표현하기 위해 참조 정보를 담은 새로운 테이블(중개모델)을 생성하게 됩니다.

ID post_id use_id
1 1 1
2 1 3
3 2 1

 

 

https://dahye-jeong.gitbook.io/til/django/basic/2019-03-07-model

 

Django Model

 

dahye-jeong.gitbook.io

https://dev-navill.tistory.com/6?category=762726

 

django의 관계형 모델 필드 - ForeignKey, OneToOneField, ManyToManyField

Notion을 정리하다 충격을 좀 받고, 내용을 나도(?) 알아볼 수 있게 정리해야겠다는 생각이 들어서 다시 블로그를 쓰게 되었다. 이전 두 개의 블로그는 너무 자세히 친절하게 작성하려다 보니 하나

dev-navill.tistory.com

https://velog.io/@hwang-eunji/backend-django-%EC%97%AD%EC%B0%B8%EC%A1%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

 

backend django 역참조 데이터 가져오기

데이터베이스 테이블에서 Foreign Key(이하 FK)가 없고 다른테이블의 FK로 지정된 테이블일때, 나를 참조하는(나를 FK로 지정한) 테이블에 접근하는 것<현재테이블>.<fk인 user컬럼="">.<역참조관계명>.all()</fk인>

velog.io

 

 

댓글