데이터 분석 기술 블로그

DB에 대하여(19)_팔로우 기능 구현 (feat. Django) 본문

DB

DB에 대하여(19)_팔로우 기능 구현 (feat. Django)

데이터분석가 이채은 2024. 5. 6. 22:02

User(M) - User(N)

0명 이상의 회원은 0명 이상의 회원과 관련이 있습니다. 즉, 회원은 0명 이상의 팔로워를 가질 수 있고, 0명 이상의 다른 회원들을 팔로잉할 수 있습니다.


ManyToManyFiled를 작성합니다.

  • 참조 : 내가 팔로우하는 사람들(팔로잉, followings)
  • 역참조 : 상대방 이밪에서 나는 팔로워 중 한 명 (팔로워, followers)
  • 바뀌어도 상관 없으나 관계 조회 시 생각하기 편한 방향으로 정한 것입니다.
# accounts/models.py

class User(AbstractUser):
    followings = models.ManyToManyField('self', symmetraicl=False, related_name='followers')

Migrations 진행 후 중개 테이블을 확인합니다.


url을 작성합니다.

# accounts/urls.py

urlpatterns = [
    ...,
    path('<int:user_pk>/follow/', views.follow, name='follow'),
]

view 함수를 작성합니다.

# accounts/views.py

@login_required
def follow(request, user_pk):
    User = get_user_model()
    person = User.objects.get(pk=user_pk)
    if person != request.user:
        if request.user in person.followers.all():
            person.followers.remove(request.user)
        else:
            person.followers.add(request.user)
    return redirect('accounts:profile', person.username)

프로필 유저의 팔로잉, 팔로워 수 & 팔로우, 언팔로우 버튼을 작성합니다.

<!-- accounts/profile.html -->

<div>
  <div>
    팔로잉 : {{ person.followings.all|length }} / 팔로워 : {{ person.followers.all|length }}
  </div>
  {% if request.user != person %}
    <div>
      <form actions="{% url 'accounts:follow' person.pk %}" method="POST">
        {% csrf_token %}
        {% if request.user in person.followers.all %}
          <input type="submit" value="Unfollow">
        {% else %}
          <input type="submit" value="Follow">
        {% endif %}
      </form>
  </div>
  {% endif %}
</div>

팔로우 버튼 클릭 후 팔로우 버튼 변화 및 중개 테이블 데이터를 확인합니다.


참고

.exists()

QuerySet에 결과가 포함되어 있으면 True를 반환하고 결과가 포함되어 있지 않으면 False를 반환합니다. 큰 QuerySet에 있는 특정 객체 검색에 유용합니다.

적용 예시 (1)
적용 예시 (2)