오늘의 학습 계획
_django drf 커뮤니티 웹사이트 팔로잉 팔로워 기능 만들기
기록하고 싶은 학습내용
_django drf 커뮤니티 웹사이트 팔로잉 팔로워 기능 만들기
소라님과 함께 창호 튜터님과 GPT의 도움을 받아 큰 산을 등반해따....ㅋㅋㅋ
여러 시행착오가 있었지만 우선 정리된 과정을 보면...
models.py
#models.py
class User(AbstractBaseUser):
email = models.EmailField(
verbose_name="email address",
max_length=255,
unique=True,
)
#팔로우, 다대다관계: 서로 참조 가능, 나뉘어 있을 필요 없고 User안에 있어도 됨,
#symmetric
following = models.ManyToManyField('self', symmetrical=False, related_name='followers', blank=True)
#follower = models.ManyToManyField('self', symmetrical=False, related_name='following', blank=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property #필수사항
def is_staff(self):
return self.is_admin
우선 생각을 해보면, 팔로잉, 팔로워도 데이터. 데이터를 만드려면 모델이 있어야지!
처음에는 팔로잉이랑 팔로워를 따로따로 컬럼으로 만들어야 한다고 생각했는데, 생각해보니까 하나만 만들고
나머지는 역참조 하여 사용하면 될 것 같았다.
그래서 뭔가 동작이 있어야 하는 팔로잉을 살리기로 했다.
urls.py
#urls.py
urlpatterns = [
path('', views.UserView.as_view(), name='user_profile'),
path('signup/', views.UserView.as_view(), name='user_view'),
path('sendmail/', views.SendVerificationCodeView.as_view(), name='user_view'),
path('mock/', views.mockView.as_view(), name='mock_view'),
path('login/', views.CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('follower/', views.FollowerView.as_view(), name='follower_view'),
path('following/', views.FollowingView.as_view(), name='following_view'),
]
팔로잉와 팔로워 두 가지 다 경로가 필요하다.
팔로워는 겟 요청만 있을 것이고
팔로잉은 겟 요청, 포스트 요청이 있을 것이다.
views.py
#views.py
class FollowingView(APIView) : # 팔로우
def get(self, request):
""" 사용자 정보를 response 합니다."""
me= request.user
return Response(UserSerializer(me.following.all(), many=True).data)
#get이 두개여도 싸우지 않는다..! 먼저 있는애가 무시됨, 따라서 두개 있는것이 의막 없음
#클래스 두개 있어야하고, url도 달라야함
# follower 등록, 내 팔로워 목록 확인, 내 팔로잉 목록 확인 url 만들기
def post(self, request):
you = get_object_or_404(User, id=request.data.get('id'))
me = request.user
print(you,me)
if you in me.following.all():
me.following.remove(you)
return Response("unfllow했습니다.", status=status.HTTP_200_OK)
else:
me.following.add(you)
return Response("follow했습니다.", status=status.HTTP_200_OK)
return Response()
class FollowerView(APIView):
def get(self, request):
""" 사용자 팔로워 정보를 response 합니다."""
me= request.user
return Response(UserSerializer(me.followers.all(), many=True).data)
제일 중요한 뷰스!
팔로잉은 겟과 포스트 함수가 있고
팔로워는 겟 함수만 있다.
팔로잉의 포스트가 제일 중요한데,
팔로잉 기능은 결국 두 사람이 만나서 다대다 관계로 생성하는 데이터이므로,
먼저 "you" 와 "me" 라는 개념을 정의해야 한다.
me는 간단히 request.user로 요청자의 아이디를 가져오고,
you는 클라이언트가 팔로우! 버튼을 누를 때,
버튼을 누름 당한 사람의 id 값을 바탕으로, 유저 모델에서 그 사람의 정보를 가져온다.
그 뒤에 언팔로우 기능도 구현하기 위해서
if 문을 넣는다.
내가 새롭게 팔로잉 하려는 대상이 이미 내 팔로잉 목록에 있는 사람이면
그 사람을 언팔로우한다. (팔로우 중복 시 언팔로우)
내가 새롭게 팔로잉 하려는 대상이 내 팔로잉 목록에 없으면
깔끔하게 그 사람을 팔로우 한다.
팔로잉의 겟은 간단히 내가 팔로우 하고 있는 사람들의 목록을 조회하는 기능이다.
팔로워의 겟은 팔로잉의 겟과 비슷하게 생겼는데, 역참조가 들어간다.
나를 팔로잉하고 있는 사람들의 목록을 불러오면 되는데,
models.py에서 following에 대한 ManyToManyField를 정의할 때, 파라미터에 related_name 이라는 것을 했다.
여기서 reated_name = " " 에서 정한 내용을 가지고
추후에 팔로잉하고 있는 사람의 데이터 테이블에 있는 내용을
팔로잉 당하고 있는 사람이 필요에 따라 역참조 할 수 있는 것이다.
그래서 역참조를 했으므로 최종적으로는 팔로워뷰 클래스에서 간편하게
return Response(UserSerializer(me.followers.all(), many=True),data)
요 코드만으로 나를 팔로잉하고 있는 사람들의 데이터를 역관광해버릴 수 있게 된다.
끝!
'About coding > Today I learned' 카테고리의 다른 글
2023년 05월 18일 TIL [#drf 데이터관계] (0) | 2023.05.18 |
---|---|
2023년 05월 12일 TIL [#JS 프론트엔드] (1) | 2023.05.13 |
2023년 05월 10일 TIL [#drf foreignkey 사용하여 앱 간 데이터 공유] (0) | 2023.05.10 |
2023년 05월 9일 TIL [#drf 게시글 만들기 CRUD #Choice #error메시지 커스텀] (0) | 2023.05.10 |
2023년 05월 8일 TIL [#drf 팀프로젝트 #S.A문서 #협업할 때 users 없이 개발하기] (0) | 2023.05.08 |