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)
생성된 중개 테이블을 확인합니다.