follow기능을 구현해 보았다.
@login_required(login_url='login')
def switch_follow(request, user_id):
"""
Switching follow & unfollow
Parameters:
user_id (int) : A specipical user's PK
"""
# pk https://stackoverflow.com/questions/2165865/django-queries-id-vs-pk
user = UserModel.objects.get(pk=request.user.id)
follow = UserModel.objects.get(pk=user_id)
try:
follower = FollowModel.objects.get(user=user, follow=follow)
follower.delete()
except FollowModel.DoesNotExist:
FollowModel.objects.create(user=user, follow=follow)
return JsonResponse({'msg': 'success'})
내가 원한건 팔로우한 사람의 이름과 그 옆에 팔로우 버튼이 있는 것이었는데 그걸 위해선 views.py에서 index 함수에서 처리를 해줘야 한다.
follow모델은 아주 간단하게 이런모양인데 .. 저장되는걸 봐선 user_id와 follow_id뿐이었다.
class FollowModel(models.Model):
user = models.ForeignKey(
UserModel, on_delete=models.CASCADE, related_name='user')
follow = models.ForeignKey(
UserModel, on_delete=models.CASCADE, related_name='follow')
그런데 이름을 어떻게 가져올 수 있을까하고 계속 생각하다가 결국 팀원분에게 여쭤봤는데 user참조를 받고 있기 때문에 Follow모델에서 user를 검색해서 follower들을 가져오면 된다고 하셨다.
Follow.objects.filter(user=user)
이렇게 말이다.
근데 이렇게 해도 가져올 수 있는건 결국 follow_id뿐 아닌가 했는데 또 다시 팀원분의 설명을 들으니 user참조를 받아서 user객체로 받아올 수 있다고 하시네..
context = {
followers = Follow.objects.filter(user=user)
}
로 html에 데이터를 보냈다. 근데 아무리 {% for in follow in followers %}를 사용해서 follow.username 을 해도 이름은 뜨지 않았다. follow.user.username도 해보고 했는데 이름이 뜨지 않았다.
follow가 user object로 온다면 follow.username이었을때 이름이 떠야하는데 .. follow.follow_id 이렇게 follow 객체로만 사용이 가능했다.
그러다가 follow.follow.username은 이름이 뜬다는 걸 알았다.
알고보니 첫 follow객체는 follow모델의 객체 그리고 그 다음 follow가 user참조를 받은 user객체인것이다.
그래서 follow의 follow의 username은 원하는대로 작동했던 것이다.
아직도 잘은 이해가 안되지만 참 오묘한 객체의 세계...?