본문 바로가기
DEV/Web 개발

Web 개발 :: 파이썬 Django Rest Framework(13) _ 프로필 페이지

by 올커 2022. 11. 6.

DRF(Django Rest Framework)(13) _ 프로필 페이지

01. 프로필 페이지

 - 사용자 프로필 페이지를 만들기 위해 정보를 가져오는 기능을 구현해보려고 한다.

 - 아래와 같이 view에서 사용할 serializer를 먼저 정의해준다.

# users/serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

 - 정의한 UserProfileSerializer를 사용하여 아래와 같이 ProfileView를 만들어주고 포스트맨으로 확인해본다.

# users/views.py

class ProfileView(APIView):
    def get(self, request, user_id):
        user = get_object_or_404(User, id=user_id)
        serializer = UserProfileSerializer(user)
        return Response(serializer.data)

 - 정보를 잘 가지고 오고 있는 것 같긴한데, 패스워드나 불필요하다고 생각되는 정보들까지 포함되어 있다. 이는 앞서서도 해보았지만 serializer의 fields에서 정의해주면 간단히 해결된다.

# users/serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'email', 'followings')

 - 가져온 데이터가 훨씬 깔끔해졌다. id, email, followings까지 잘 가져오고 있다.

 - 추가로 나를 팔로우하는 followers를 가져오려면 어떻게 해야 할까? 앞서 사용했던 StringRelatedField를 사용하면 해결할 수 있다.

# users/serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    followers = serializers.StringRelatedField(many=True)

    class Meta:
        model = User
        fields = ('id', 'email', 'followings', 'followers')

 - 어? 근데 저 팔로워는 본인이다.. 다른 사람으로 팔로우를 지정해놓아야한다. admin페이지를 들어가보니 user email로 나열되어 있어 번호로는 알기 힘들다.

 - 또 사용자를 클릭해서 들어가보면 설정해줄 수 있는 항목들이 많지 않다.

- 이를 바꿔주기 위해 admin.py를 수정해야 한다. 아래처럼 list_display에 'id'를 추가하였다. 또 fieldsets에는 'followings'를 추가하였다.

# users/admin.py

class UserAdmin(BaseUserAdmin):
    ...
    list_display = ('id', 'email', 'is_admin')
    ...
    fieldsets = (
        (None, {'fields': ('email', 'password', 'followings')}),
        ('Permissions', {'fields': ('is_admin',)}),
    )

- 그러자 리스트 확인란에 ID가 생긴 것을 확인할 수 있다.

 - 사용자를 클릭해서 들어가보면 Followings도 설정할 수 있도록 바뀌어있다.

 - 그런데 현재 followings를 아무것도 선택하지 않으면 required가 나타난다. models.py에 가서 blank=True 속성을 추가해주어야 한다.

# users/models.py

class User(AbstractBaseUser):
    ...
    followings = models.ManyToManyField('self', symmetrical=False, related_name="followers", blank=True)

 - 변경해주고, admin에서 follower연결관계를 서로 해주었다. 아래와 같이 확인할 수 있는데, 현재 보면 followings와 followers가 나타내는 형식이 다르다.

 - serializers.py에서 아래와 같이 변경해보았다.

# users/serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    followers = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

 - 변경 후 확인해보니 동일하게 일치되긴했는데, 모두 id값으로 변경되었다.

 - 둘 다 이메일로 쓰고싶을 경우에는 아래와 같이 다시 변경해주어야 한다.

# users/serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    followers = serializers.StringRelatedField(many=True)
    followings = serializers.StringRelatedField(many=True)

 - 둘 다 이메일로 확인이 된다. 용도에 따라서 선택하여 사용하면 된다.

 - 이제 사용자가 작성한 글들을 불러올 수 있도록 해보겠다. serializers.py에 아래와 같이 추가해준다.

 - 리스트를 가져오는 것이기 때문에 ArticleListSerializer를 가져오고, article_set에 넣어준다.

# users/serializers.py

from articles.serializers import ArticleListSerializer


class UserProfileSerializer(serializers.ModelSerializer):
    ...
    article_set = ArticleListSerializer(many=True)

    class Meta:
        model = User
        fields = ('id', 'email', 'followings', 'followers', 'article_set')

 - 이제 작성했던 글 까지 확인이 가능하다.

 - 또, 내가 좋아요한 글들을 가져오려면 어떻게 해야할까?

 - Article 모델에 likes를 확인해보면 ManyToMany 필드로 User와 연결되어있고, related_name이 'like_articles'로 확인된다. 그럼 User쪽에서 like_articles를 통해 Article 모델을 가져올 수 있다.

 - UserProfileSerializer에 가서 like_articles를 아래와 같이 추가해준다.

class UserProfileSerializer(serializers.ModelSerializer):
    ...
    like_articles = ArticleListSerializer(many=True)

    class Meta:
        model = User
        fields = ('id', 'email', 'followings', 'followers', 'article_set', "like_articles")

 - 좋아요 눌렀던 글들이 이제 확인이 된다.

 

반응형

댓글