Assignment #1 | Westagram [Mission 10] 팔로우(follow) 기능 구현

Jayson Hwang·2022년 5월 21일
0

Westagram Project

목록 보기
11/11
post-thumbnail

1.. users app 활용

  • follow 관련 기능은 유저들 사이에서 일어나기 때문에 users app 사용

2.. models.py

class Follow(models.Model):
    from_user = models.ForeignKey('User', on_delete=models.CASCADE, related_name= 'to_user')
    to_user = models.ForeignKey('User', on_delete=models.CASCADE, related_name='from_user')

    class Meta:
        db_table = "follows"
  • Follow class는 User와 User 사이의 중간 테이블로 from_user, to_user 두가지 attribute 모두 User class를 ForeignKey로 갖음

  • 따라서 related_name 옵션이 반드시 설정되어야함 (없으면 makemigration안됨)

  • Related_name 관련 블로그(1) / 블로그(2)- 위코드멘토님

  • 모델 작성 완료 후 makemigartions, migrate 진행

In : user = User.objects.get(id=1)

In : user
Out: <User: User object (1)>

In : follow = Follow.objects.filter(from_user=user)

In : follow
Out: <QuerySet [<Follow: Follow object (2)>, <Follow: Follow object (5)>]>

In : follow.user
  • 셀프참조가 아니라면 follow.user_set은 역참조(또는 정참조)로 해당 객체를 가지고 있어야함
  • 하지만 이 경우, user_set이라는 속성만으로는 자신이 바라보고 있는 두 User 가운데 어떤 속성에 접근해야하는지 알 수 없는 상황 발생 가능
  • 따라서, 셀프 참조의 경우 반드시 related_name을 설정해야함

3.. views.py

📌 내가 작성한 Follow View 코드

class FollowView(View):
    @signin_decorator
    def post(self, request, user_id):
        user = request.user
        
        from_user = user
        to_user = User.objects.get(id=user_id)
        follow = Follow.objects.filter(from_user = from_user, to_user=to_user)

        if follow:
            follow.delete()
            message = 'unfollowing'

        else:
            Follow.objects.create(
                from_user = from_user,
                to_user = to_user,
            )
            message = 'following'

        return JsonResponse({'message':message}, status=200)

4..URLconf

postings/urls.py

from django.urls import path
from users.views import SignUpView, SignInView, FollowView

urlpatterns = [
    path('/signup', SignUpView.as_view()),
    path('/signin', SignInView.as_view()),
    path('/follow/<int:user_id>', FollowView.as_view()),
]

profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글