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")
- 좋아요 눌렀던 글들이 이제 확인이 된다.
'DEV > Web 개발' 카테고리의 다른 글
Web 개발 :: Django rest framework, 추천 시스템 _TIL#45 (0) | 2022.11.07 |
---|---|
Web 개발 :: 파이썬 Django Rest Framework(14) _ 피드 (0) | 2022.11.07 |
Web 개발 :: 파이썬 Django Rest Framework(12) _ Serializer 보완(Likes count, Comments count) (0) | 2022.11.05 |
Web 개발 :: 파이썬 Django Rest Framework(11) _ 좋아요, 팔로우 기능 (1) | 2022.11.04 |
Web 개발 :: Django rest framework, 추천 시스템, 코사인 유사도, TF-IDF _TIL#44 (0) | 2022.11.04 |
댓글