코딩,해볼까

05.23. [리치메이커_project. 2] 챌린지 게시물 작업 (1) 본문

Back/TIL

05.23. [리치메이커_project. 2] 챌린지 게시물 작업 (1)

떠굥 2023. 5. 23. 13:04

 

Tutorial 3: Class-based Views

Django REST framework의 class Views 공식문서와 이전 프로젝트를 살펴보며 챌린지 게시물 작업.

 


0.  오늘 배운 것

1. 프로젝트 DB로 mySQL 연결하였다. 이 부분은 따로 정리해보도록 해야겠다.

DROP DATABASE db_richmaker;
create database db_richmaker character set utf8mb4 collate utf8mb4_general_ci;
use db_richmaker;
SELECT * FROM articles_account;
SELECT * FROM users_user;

2. 다른 팀원분의 JS 연결과정을 보면서, 프론트와 백을 연결할 때 CORS 처리가 필요했다는 사실을 기억했다.

 


1.  문제점

1. erd의 챌린지 북마크와 팔로우가 서로 바뀌어야 한다.

 - 북마크는 단순히 저장의 기능만

 - 챌린지는 팔로우 팔로잉처럼 구현해야 어떤 사람이 참여하는지 등을 불러오는 것이기 때문

 - 팀원분들과의 상의 끝에 이후에 수정하기로 했다.

 

2. 오전에 구현했던 다중이미지를 가지고 POST나 PUT을 했더니 제대로 작동하지 않았다.

GET은 아래와 같이 잘 동작하지만.. 나머지가 불가능한 상태.

 

3. 이전 프로젝트와 다르게 이번에는 북마크와 좋아요 기능을 유저에서 구현하게 되었다. 챌린지에 아무도 참여하지 않았을 때, 챌린지를 삭제하고자 하였는데, 이 때 유저의 북마크 기능을 가져오려고 했지만, 역참조로 가져와지지 않는 문제가 있다.

 


2. 시행착오

 

혹시나 구현이 되지 않을 상항을 생각하여 기본적인 삭제 기능을 구현하였다.

# 기본 삭제 구현
challenge = get_object_or_404(Challenge, id=challenge_id)
if request.user.id == challenge.user_id:
     challenge.delete()
     return Response("게시글이 삭제되었습니다.", status=status.HTTP_204_NO_CONTENT)
 else:
     return Response("게시글 삭제 권한이 없습니다.", status=status.HTTP_403_FORBIDDEN)

 

내가 구현하고자 한 것은 챌린지를 시작하는 유저를 나타내는 유저모델의 북마크를(후에 팔로우로 변경 예정) 가져와서 챌린지를 한 사람도 시작하지 않았다면, 그 때는 챌린지를 삭제할 수 있도록 하고자 했다.

#User 모델의 북마크
bookmark = models.ManyToManyField(Challenge, symmetrical=False, related_name='bookmarking_people', blank=True)

 

역참조를 하면 된다는 팀원분의 말을 듣고 아래와 같은 코드를 작성해봤다.

related_name인 bookmarking_people, bookmark 등 다양하게 코드를 변경해봤지만, 원하는 기능을 구현하지 못했다. 

if challengeMember == 0 도 처음에는 필드가 어떻게 표시될 지 몰라 None이나 0 일 때로 지정했었다.

challengeMember = challenge.user.bookmarking_people
if challengeMember == 0:
            if request.user.id == challenge.user_id:
                challenge.delete()
                return Response("챌린지가 삭제되었습니다.", status=status.HTTP_204_NO_CONTENT)
            else:
                return Response("챌린지 삭제 권한이 없습니다.", status=status.HTTP_403_FORBIDDEN)
        else:
            return Response("챌린지를 삭제할 수 없습니다.", status=status.HTTP_403_FORBIDDEN)

 

고민하다보니 user에 북마크한 사람의 숫자를 세는 시리얼라이저가 있었다.

이를 가져와서 매우 흡사하게 적어보기로 했다.

  challenge = get_object_or_404(Challenge, id=challenge_id)
  serializer = ChallengeMemberSerializer(challenge)
        # print(serializer.data.values())
        challengeMember = serializer.data.get('bookmarking_people_count')
        # print(challengeMember,type(challengeMember))

 

시리얼라이저를 가져와서 연결하였다.

class ChallengeMemberSerializer(serializers.ModelSerializer):
    bookmarking_people_count = serializers.SerializerMethodField()

    def get_bookmarking_people_count(self,obj):
        return obj.bookmarking_people.count()
    class Meta:
        model = User
        fields = ('bookmarking_people_count',)

3. 해결방법

challenge = get_object_or_404(Challenge, id=challenge_id)
serializer = ChallengeMemberSerializer(challenge)
challengeMember = serializer.data.get('bookmarking_people_count')
	if challengeMember == 0:
		if request.user.id == challenge.user_id:
		challenge.delete()
		return Response("챌린지가 삭제되었습니다.", status=status.HTTP_204_NO_CONTENT)
	else:
return Response("챌린지 삭제 권한이 없습니다.", status=status.HTTP_403_FORBIDDEN)
else:
return Response("챌린지를 삭제할 수 없습니다.", status=status.HTTP_403_FORBIDDEN)

4. 알게된 점

type(), print() 생활화.

 

 

 

 

 

Comments