Django Database & Model

Jwahoon Kim·2021년 7월 7일
0

Django

목록 보기
9/10

1. Django의 Database 와 Modeld에 대해 알아보자.

데이터 베이스의 모델간의 관계

들어가기전에!

Primary key : DB Table의 한 행을 고유하게 식별하는 정보, 보통 id값
Foreign key : 어떤 Table이 가지고 있는 다른 Table의 Primary key

  1. OneToOne
  • 테이블의 한 행과 다른 테이블의 한 행이 1:1로 대응되는 관계입니다.

아래와 같이 참조할 수 있다.

1. user1.profile.major 
2. User.objects.filter(profile__college='서울대학교')
  1. OneToMany
  • 모델의 한 객체와 다른 모델의 여러 객체들이 1:N 으로 대응되는 관계입니다.

  • 1:N관계를 맺어주는 경우, 한 개의 Post에는 여러개의 Comment가 생성될 수 있지만 한 개의 Comment는 한 개의 Post 만을 가집니다. 그것이 1:N 이죠! 따라서 1의 입장에서는 자신.모델이름소문자_set이라는 용어로 자신의 N관계 셋을 불러오고, N 의 입장에서는 자신.모델이름소문자의 형태로 관계맺어진 1을 불러옵니다.
  • Post post1이 1:n 관계맺은 Comment를 모두 불러올 때
    => post1.comment_set
  • Comment comment1이 1:n 관계맺은 Post를 불러올 때
    => comment1.post
  • 이때 'comment_set'은 Post가 Comment를 불러오기 위해 사용하는 related_name입니다. 처음에 ForeignKey 에 related_name 을 지정해주지 않으면 (소문자 해당모델이름)_set 이라는 용어로 related_name 이 자동 생성됩니다.
  • 즉 ForeignKey에 related_name 속성을 지정해주면 그것으로 불러올 수 있습니다.
  1. ManyToMany
  • Post 모델과 Tag 모델 사이를 중개하는 모델을 만들어 줌으로써 ManyToMany 관계로 설정해준다.

  • 장고의 ManyToManyField 로 두개의 모델을 이어주면, 따로 중개 테이블을 지정해주지 않아도 장고에서 자동으로 중개테이블을 생성합니다. 만약 이 중개테이블에 접근하고 싶다면 Post.tag_set.through 이런 식으로 코드를 작성하면 됩니다!

  • 중개 테이블에 다른 필드를 추가하고싶다면(예를 들어, 피드와 태그가 연결된 날짜. 연결시킨 사람) through 파라미터를 해당 필드에 추가해서 직접 만든 테이블을 중개테이블로 지정해줄 수도 있습니다.

# ./blogPosts/models.py

class Post(models.Model):
    ...
    like_users = models.ManyToManyField(User, blank=True, related_name='like_posts', through='Like')

...

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.now)

...
  • related_name: User에서 접근할 때 related_name으로 post에 접근할 수 있습니다. 즉 post에 like_users라는 테이블을 만들어준 것처럼, user에도 (related_name으로 지정한) like_posts라는 필드가 생기게 됩니다. post.like_users는 해당 post에 좋아요를 누른 유저들일테고, user.like_posts는 해당 user가 좋아하는 posts겠지요.

  • through 속성에 중개 테이블을 해당 모델로 할 것임을 명시해 줄 수 있음

1개의 댓글

comment-user-thumbnail
2021년 7월 14일

멋져요 멋쟁이 같아요

답글 달기