Django

GreenBean·2021년 4월 30일
post-thumbnail

관계를 표현하는 모델 필드

model을 설계하는데 있어서 관계는 뺴놓을 수 없는 중요한 개념. 각 모델 간에 여러 관계를 정의함으로서 많은 걸을 구현 할 수 있게 되며, 관계의 종류에는 총 3가지가 있음

ForeignKey

ForeignKey1:N 관계를 의미. 예를 들어 게시글과 댓글을 생각할 수 있는데, 하나의 글에는 그 글에 해당하는 댓글이 여러 개 존재하게 되므로 ForeignKey를 만족

class Post(models.Model):
  # 생략
class Comment(models.Model):
  post = models.ForeignKey(Post, on_delete=models.CASCADE)
  • 1:N 중에서 N인 쪽에서 관계를 선언
  • 두 개의 인자 필요
    • 하나는 대상이 되는 클래스
    • 다른 하나는 삭제 시 이슈에 대한 설정
  • on_delete 설정 : 각각에 대한 설명은 1인 쪽의 데이터가 삭제 되었을 시, N인 쪽의 데이터를 어떻게 처리할 지에 대한 설정
    • CASCADE : 이와 연결되어 있는 모든 N쪽 데이터를 삭제
    • PROTECT : 1인 쪽의 데이터가 삭제가 되지 않도록 보호
    • SET_NULL : null로 값을 대체하게 되어 필드에 null=True 옵션이 있어야만 가능
    • SET_DEFAULT : default 로 값을 대체하게 되어 필드에 default=True 옵션이 있어야만 가능
    • SET : 대체할 값이나 함수를 지정
    • DO_NOTHING : 아무 것도 하지 않지만 db 에서 오류가 발생할 수 있음
  • 상대 모델에 접근하기
    • N인 쪽에서는 관계되어 있는 모델이 하나이므로 바로 접근이 가능하지만, 1인 쪽에서는 관계되어 있는 객체가 많기 때문에 _set을 통해서 접근 가능
    # N -> 1
    comment.post

    # 1 -> N
    post.comment_set

OneToOneField

OneToOneField1:1 관계를 의미

ManyToManyField

ManyToManyField다대다 관계를 의미합니다. 예시로는 Post 와 Tag 를 생각할 수 있음

# 방법 1
class Post(models.Model):
  tag = models.ManyToManyField('Tag',blank=True)
 
class Tag(models.Model):
  # 생략
  
  
# 방법 2
class Post(models.Model):
	# 생략
 
class Tag(models.Model):
  post = models.ManyToManyField(post,blank=True)
  • 해당 관계는 두 모델 중 어느 쪽에서 선언해도 무방
  • 위에 있는 model에서 아래 있는 model을 지정할 때는 문자열로 표현
  • blank=True 옵션을 걸어준 이유는 글을 쓸 경우 tag를 하나도 지정안할 수 도 있기 때문
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글