728x90
320x100
친구추가는 A가 친구신청 -> 대기 -> B가 친구 수락 -> 친구관계
이기 때문에 모델 안에서 manytomany(self) 를 사용하지 않고, 직접 테이블을 만들어서 필드 두개로 User와User를 연결했었다.
user_friend : 친구신청 상태 테이블 (manytomany)
friends = models.ManyToManyField("self", related_name='friends', blank=True)
user_friends : 친구 상태 테이블
class Friend(models.Model):
from_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_friend_requests')
to_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_friend_requests')
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=20, choices=[('pending', '신청중'), ('accepted', '수락됨'), ('rejected', '거절됨')], default='신청중')
그런데 친구삭제는 일방향이 아니다. 한쪽이 끊으면 둘 다 끊어져야 하기 때문에 user_friends 모델을 사용할 수 없다.
친구관계가 생기면 user_friend 모델에는 레코드가 두 개 생긴다.
from 과 to 가 바뀌어서 두 개가 생기기 때문에, 삭제시에 매개변수로 둘중 하나의 user_id 를 가져올 수도 없다. 그래서 이 테이블의 pk 값을 사용하기로 함.
그리고 친구 삭제 후에도 다시 친구신청을 하기 위해서는 user_friend 테이블에서도 삭제해줘야 한다.
어차피 둘 다 삭제할 거기 때문에 삭제를 누름당한(?) 사용자의 정보를 가져오고 로그인된 유저의 정보를 가져와 둘 모두의 정보가 있는 테이블을 삭제하면 됨
그리고 해당 유저들의 정보가 있는 user_friend 테이블도 삭제하면 됨
############## 친구삭제 ##############
class FriendDeleteView(APIView):
permission_classes = [IsAuthenticated]
def delete(self, request, friend_id):
friend = get_object_or_404(Friend, id=friend_id)
user1 = User.objects.get(id=friend.from_user_id)
user2 = User.objects.get(id=friend.to_user_id)
if friend.from_user != request.user and friend.to_user != request.user:
return Response({"message": "권한이 없습니다."}, status=status.HTTP_403_FORBIDDEN)
# 친구 삭제
friend.delete()
user1.friends.remove(user2)
return Response({"message": "친구를 삭제했습니다."}, status=status.HTTP_200_OK)
300x250
반응형
GitHub 댓글