DB (M:N / Article - User 'Like'기능)

윤동훈·2023년 4월 12일
0

ManyToManyField

  • 다대다(M:N) 관계 설정 시 사용하는 모델 필드
  • 하나의 필수 위치인자(M:N관계로 설정할 모델 클래스)가 필요
  • 모델 필드의 Related Manager를 사용하여 관련 개체를 추가, 제거 또는 만들 수 있음
    - ex. add(), remove(), create(), clear() etc.
  • django는 다대다 관계를 나타내는 중개 테이블을 만듦
  • 테이블 이름은 ManyToManyField 이름과 이를 포함하는 모델의 테이블 이름을 조합하여 생성됨
  • 'db_table' arguments를 사용하여 중개 테이블의 이름을 변경할 수도 있음

[ManyToManyField's Arguments]

1. related_name

  • target model이 source model을 참조할 때 사용할 manager name
  • ForeignKey의 related_name과 동일

2. through

  • 중개 테이블을 직접 작성하는 경우, through 옵션을 사용하여 중개 테이블을 나타내는 django 모델을 지정
  • 일반적으로 중개 테이블에 추가 데이터를 사용하는 다대다 관계와 연결하려는 경우에 사용됨

3. symmetrical

  • default : True
  • ManyToManyField가 동일한 모델(on self)를 가리키는 정의에서만 사용
  • True인 경우
    • _set매니저를 추가하지 않음
    • source 모델의 인스턴스가 target 모델의 인스턴스를 참조하면 자동으로 target 모델 인스턴스도 source 모델 인스턴스를 자동으로 참조하도록 함(대칭)
  • 대칭을 원하지 않는 경우 False로 설정
  • 같은 이름의 메서드여도 각 관계(N:1, M:N)에 따라 다르게 사용 및 동작됨
    • N:1에서는 target 모델 객체만 사용 가능
    • M:N 관계에서는 관련된 객체에서 모두 사용 가능
  • 메소드 종류
    • add(), remove(), create(), clear(), set() 등

add()

  • "지정된 객체를 관련 객체 집합에 추가"
  • 이미 존재하는 관계에 사용하면 관계가 복제되지 않음
  • 모델 인스턴스, 필드 값(PK)을 인자로 허용

remove()

  • "관련 객체 집합에서 지정된 모델 개체를 제거"
  • 내부적으로 QuerySet.delete()를 사용하여 관계가 삭제됨
  • 모델 인스턴스, 필드 값(PK)을 인자로 허용

LIKE(좋아요 기능)

  • Article과 User의 M:N 관계 설정을 통한 좋아요 기능 구현하기

[모델 관계 설정]

파일 경로 ➡️ artiles/models.py

  • ManyToManyField 작성

모델 변경 후 migration 작업 진행

$ python manage.py makemigrations

➡️ like_user 필드 생성 시 자동으로 역참조에는 .article_set 매니저가 생성됨

  • 그러나 이전 N:1(Article-User)관계에서 이미 해당 매니저를 사용 중
  • user.article_set.all() : 해당 유저가 작성한 모든 게시글 조회
  • user가 작성한 글들(user.article_set)user가 좋아요를 누른 글(user.article_set)을 구분할 수 없게 됨
  • user와 관계된 ForeignKey 혹은 ManyToManyField 중 하나에 related_name 을 작성해야함

파일 경로 ➡️ artiles/models.py

$ python manage.py makemigrations

$ python manage.py migrate
  • ManyToManyField에 related_name 을 작성후 migration

LIKE 구현

파일 경로 ➡️ articles/urls.py

파일 경로 ➡️ articles/views.py

파일 경로 ➡️ articles/index.html

  • line 16-25 추가 : 좋아요 버튼 출력

0개의 댓글