[drf]airbnb-api -11 MeView & user_detail
19504 ワード
プロジェクトディレクトリ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
Reference
この問題について([drf]airbnb-api -11 MeView & user_detail), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeseong-dev/drfairbnb-api-11-MeView-userdetailテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol