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
https://dev-navill.tistory.com/6?category=762726
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
Django - N:M 좋아요기능(Ajax 사용 O) (0) | 2020.08.10 |
---|---|
HttpRequest, HttpResponse, Render, HttpRedirect, JsonResponse (0) | 2020.08.05 |
Django - N:M 좋아요기능(Ajax 사용 X) (0) | 2020.08.03 |
쟝고 - 댓글 달기 (2) | 2020.08.01 |
ModelForm - 댓글 달기 (6) | 2020.07.29 |
댓글