이번에는 팔로우, 팔로잉 기능을 구현해 보도록 하겠습니다.

1. Follow 모델 작성

팔로우 기능의 모델은 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는 명확합니다. UserPost의 사이를 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,) # 비대칭 관계**

...