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에 있는 특정 객체 검색에 유용합니다.