[drf]airbnb-api -11 MeView & user_detail



プロジェクトディレクトリurlの設定


usersアプリケーションを追加し、APIとurl接続に移動します.
...
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/rooms/', include('rooms.urls')),
    path('api/v1/users/', include('users.urls')),
]
...

user API url


users/urls.py
from django.urls import path
from . import views

app_name = "users"

urlpatterns = [
    path('me/', views.MeView.as_view()),# 나의 계정 정보
    path('<int:pk>/', views.user_detail), # 다른 유저의 정보
]

user API - MeView


自分のアカウント情報を確認して修正するAPIを書きます
必要なものをインポートします.APIViewと書いて、まず関連するものを上に敷きます.
今回は本当に大切な奴の一人です.permission_classes APIViewを使えば使えるカードの一つクラスのライセンスはどれですか?あげるという意味ですか.
回りくどい言い方をすると、ログイン状態であれば対応するAPI、MeViewクラスにアクセスできます.
users/views.py
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated #  인증한 유저만 해당 메소드에 접근 가능하도록함.
from rest_framework.decorators import api_view
from rest_framework.views import APIView
from rest_framework import status
from .models import User
from .serializers import ReadUserSerializer, WriteUserSerializer


class MeView(APIView):

    permission_classes = [IsAuthenticated] # 인증된 유저만 접근 가능

    def get(self, request):
        return Response(ReadUserSerializer(request.user).data) # stats 키워드가 없으면 기본값으로 200을 뱉어네요.

    def put(self, request):
        serializer = WriteUserSerializer(request.user, data=request.data, partial=True)
        # partial=True옵션 안쓰면 PUT메서드 사용시 하나 혹은 전체가 아닌 일부만 달랑 보내면 오류발생.
        if serializer.is_valid():
            serializer.save()
            return Response()
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQEUST)

@api_view(['GET'])
def user_detail(request, pk):
    try:
        user = User.objects.get(pk=pk)
        return Response(ReadUserSerializer(user).data)
    except User.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

user API - serializer


既存のSerializerクラスを継承するUserSerializerをModelSerializerに継承し、名前をRelatedUserSerializerに変更します.RelatedUserSerializerの目的は関係を確立することであり、まず情報を表現するために作成される.
はい、部屋をチェックインしたホストの情報と繋がっています
すなわち、オーバーラップシーケンスRiserとして、以下のReadRoomSerializerのクラス変数で使用される.
# rooms/serializers.py
...
from users.serializers import RelatedUserSerializer

class ReadRoomSerializer(serializers.ModelSerializer):

    user = RelatedUserSerializer()

    class Meta:
...
逆にReadUserSerializerに暗証番号があればもっとプライベートな情報を見せるために
user/serializers.py
既存のRoom APIでRoom SerializerをSerializerと書きましたスリムで便利になるためには、以下のようにModelSerializerを継承して作成します.
from rest_framework import serializers
from .models import User


class RelatedUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'avatar',
            'superhost',
        )


class ReadUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        exclude = (
            'groups',
            'user_permissions',
            'password',
            'last_login',
            'is_superuser',
            'is_staff',
            'is_active',
            'date_joined',
        )


class WriteUserSerializer(serializers.ModelSerializer): 
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email') # Profile을 변경할때 사용할 API에 사용

    def validate_first_name(self, value):
        print(value)
        return value.upper() # 특정필드를 오버라이딩하여 사용할 수 있음
room/serializer.py
既存の非常に長い奴WriteUserSerializerはModelSerializerを引き継いで書いた
モデルにルームクラスを入れるメタクラスを作成します.
excludeメタクラス変数を作成し、4つを削除して表示します.
from rest_framework import serializers
from users.serializers import RelatedUserSerializer
from .models import Room
class ReadRoomSerializer(serializers.ModelSerializer):
    user = RelatedUserSerializer()
    class Meta:
        model = Room
        exclude = ("modified",)


class WriteRoomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Room
        exclude = ("user", "modified", "created")

    def validate(self, data):
        if self.instance:
            check_in = data.get("check_in", self.instance.check_in)
            check_out = data.get("check_out", self.instance.check_out)
        else:
            check_in = data.get("check_in")
            check_out = data.get("check_out")
        if check_in == check_out:
            raise serializers.ValidationError("Not enough time between changes")
        return data