관계를 표현하는 모델 필드 #ManyToManyField

2022. 1. 3. 15:33강의 정리/Django 기초

반응형
ORM은 어디까지나, SQL 생성을 도와주는 라이브러리이지, ORM DB에 대한 모든 것을 알아서 처리해주지는 않는다.그러므로 보다 성능 높은 애플리케이션을 만들고자 한다면, 사용할 DB엔진과 SQL에 대해 보다 높은 이해가 필요하다.

 


 

 

RDBMS에서의 관계 예시 #설계하기 나름임

1 : N 관계 -> models.ForeignKey로 표현

  • 1명의 유저(User)가 쓰는 다수의 포스팅(Post) # 다수측(Post)에 ForeignKey
  • 1명의 유저(User)가 쓰는 다수의 댓글(Comment) # 다수측(Comment)에 ForeignKey
  • 1개의 포스팅(Post)에 다수의 댓글(Comment) # 다수측(Comment)에 ForeignKey

 

1 : 1 관계 -> models.OneToOneField로 표현

  • 1명의 유저(User)는 1개의 프로필(Profile) # 관계를 User측이나 Profile측 아무 곳에 정의 해도된다. 그러나 보통 Profile 측에서 User에 대한 관계를 정의한다.
  • Django에서는 "auth"라는 앱에서 User라는 모델을 지원해준다. 물론 커스텀 User 모드를 만들 수는 있다.

 

M : N 관계 -> models.ManyToManyField로 표현

  • 1개의 포스팅(Post)에는 다수의 태그(Tag)
  • 1개의 태그(Tag)에는 다수의 포스팅(Post)

 


 

ManyToManyField

  • M : N 관계에서 어느 쪽이라도 필드 지정 가능

 


 

ManyToManyField(to, blank=False) #인자 옵션

to : ManyToManyTag측(M : N에서 N측)에 지정해도 되고, Post측(M : N에서 N측)에 지정해도 된다. 단 M측에 지정할 때 to인자의 Tag(N측)이 M측보다 아래에 위치하면 참조하는데 오류가 생기기에 'N'으로 문자열로 지정해 주어야 한다.

 

blank : 해당 모델이 없는 상황을 허용할 건지에 대해 물어보는 옵션 # True = 허용

class Post(models.Model):
    tag_set = models.ManyToManyField('Tag', blank=True)
    # Tag를 문자열로 적은 이유는, Tag Class가 맨 아래 있기 때문에 참조하는데 있어서 오류가 생기기 때문이다.
    # blank는 Tag가 없는 상황을 허용할건지 (True)를 물어보는 인자 옵션이다.
    

class Comment(models.Model):
	tag_set = models.ManyToManyField('Tag', blank=True)
 
 

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True) # 태그는 해당 태그 테이블 내에서 유일해야 하기에 unique 사용
    #post_set = models.ManyToManyField(Post) # reverse 방법
    
    def __str__(self):
        return self.name

 

 

 


 

RDBMS지만, DB따라 NoSQL 기능도 지원 # 하나의 Post안에 다수의 댓글 저장 가능

djkoch / jsonfield

  • 대개의 DB엔진에서 사용 가능
  • TextField / CharField를 래핑
  • dict 등의 타입에 대한 저장을 직렬화하여 문자열로 저장 # 내부 필드에 대해 쿼리 불가

https://www.delftstack.com/ko/howto/django/django-create-json-response/

 

 

django.contrib.postgres.fields.JSONField

  • 내부적으로 PostgreSQL의 jsonb 타입
  • 내부 필드에 대해 쿼리 지원

 

adamchainz / django-mysql

  • MySQL 5.7 이상에서 json 필드 지원

 

반응형