이번에는 팔로우, 팔로잉 기능을 구현해 보도록 하겠습니다.
팔로우 기능의 모델은 accounts/models.py
에 작성하도록 하겠습니다.
파일명 : accounts/models.py
class Follow(models.Model):
from_user = models.ForeignKey(Profile,
related_name='follow_user',
on_delete=models.CASCADE)
to_user = models.ForeignKey(Profile,
related_name='follower_user',
on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True) # 관계가 언제 생겼는지 작성
def __str__(self):# 인스턴스 추적 양식 지정
return "{} -> {}".format(self.from_user, self.to_user)
class Meta:
unique_together = (
('from_user', 'to_user') # 유니크한 관계 형성
)
Follow 모델의 from_user 필드와 to_user 필드를 보시면 둘 다 Profile 모델을 참조하고 있습니다.
중계 모델을 사용했던 Like 모델과 비교를 해보면 Like는 명확합니다. User와 Post의 사이를 Like가 중계해주고 있습니다.
파일명 : post/models.py
class Like(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
unique_together = (
('user', 'post')
)
Follow 모델은 이보다 난이도가 있는 모델 관계입니다. 헷갈리니 주의해서 보셔야 합니다. Profile 모델에 ManyToManyField를 추가합니다.
파일명 : post/models.py
class Profile(models.Model):
...
**follow_set = models.ManyToManyField('self', # 자신을 참조
blank=True, # 아무도 팔로우를 안한 상태
through='Follow', # 중간 모델
symmetrical=False,) # 비대칭 관계**
...