데이터 분석 기술 블로그

DB에 대하여(16)_좋아요 모델 관계 설정 (feat. Django) 본문

DB

DB에 대하여(16)_좋아요 모델 관계 설정 (feat. Django)

데이터분석가 이채은 2024. 5. 3. 09:00

1. 모델 관계 설정

Many to Many relationships (N:M or M:N)

한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우 양쪽 모두에서 N:1 관계를 갖습니다.

Article(M) - User(N)

0개 이상의 게시글은 0명 이상의 회원과 관련이 있습니다. 게시글은 회원으로부터 0개 이상의 좋아요를 받을 수 있고, 회원은 0개 이상의 게시글에 좋아요를 누를 수 있습니다.


ManyToManyField 작성하기

# articles/models.py

class Article(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=10)
    content = models.TextField()
    create_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

Migration 진행 후 에러가 발생합니다.


user.article_set 역참조 매니저 충돌

  • N:1은 유저가 작성한 게시글
  • M:N은 유저가 좋아요 한 게시글
  • like_users 필드 생성 시 자동으로 역참조. article_set 매니저가 생성됩니다.
  • 그러나 이전 N:1(Article_User) 관계에서 이미 같은 이름의 매니저를 사용 중입니다 (user.article_set.all() → 해당 유저가 작성한 모든 게시글 조회).
  • 'user가 작성한 글 (user.article_set)'과 'user가 좋아요를 누른 글(user.article_set)'을 구분할 수 없게 됩니다.
  • user와 관계된 ForeignKey 혹은 ManyToManyField 둘 중 하나에 related_name 작성이 필요합니다.

related_name 작성 후 Migration 재진행

# articles/models.py

class Article(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_articles')
    title = models.CharField(max_length=10)
    content = models.TextField()
    create_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

생성된 중개 테이블을 확인합니다.


User - Article간 사용 가능한 전체 related manager