[drf]airbnb api - 8 Create Room
23146 ワード
以前に作成したすべてのAPIViewを除去し,根源論理を理解するために,メニュー化して返すことを試みた.
すなわち,ノダは符号化に近い方式を用いる.
ああ!参考になるところは自動で掴みますか?ページ名をいちいち書き出す
どうして.ページ名を実装するためにgenericviewを使用しているので、generic viewを破壊します.(ジェニーンリックビューにはページの情報が含まれています.)
FBV
もしあなたが私に何かをしてくれるなら、Serializerクラス定義のcreate()メソッドを使います!東!呼び出して論理を実行します.
何かを変えたら、逆にupdate()メソッドを検出して寝ることができます!東!コールで論理を実行しますか?
結論:ビューロジックはcreate()とupdate()メソッドを呼び出しません!save()メソッドを使用!
参照として、シーケンスRiser(インスタンス).dataは、HTTP method bodyに送信される値を示す.
rooms/views.py
rooms/serializers.py
ある程度の魚の群れであれば、以下のように確認できます.
adminでアシストを確認します.
すなわち,ノダは符号化に近い方式を用いる.
ああ!参考になるところは自動で掴みますか?ページ名をいちいち書き出す
どうして.ページ名を実装するためにgenericviewを使用しているので、generic viewを破壊します.(ジェニーンリックビューにはページの情報が含まれています.)
FBV
ビューを再構築しましょう.
GETに移行する際、ReadRoom Serializer()クラスの2つの必須パラメータを作成し、終了点演算子を使用してデータ属性にアクセスすることに注意してください.
また、JSONオブジェクトがPostmanとして{name:"Hyeseong}"に送信された場合、POSTを介して分岐文に会い、要求する.コンソールにデータを書き込んで検証すると、{name:[Hyeseong]}が表示されます.
簡単に言えば、JSONオブジェクトが->Python dictionaryに変換されたことを@api view()で確認できます.
POST、PUTなど、クライアントからデータを受信してデバイスに保存する必要がある場合は、if serializer.is_valid():
などの有効性チェックが必要です.
rooms/views.pyfrom rest_framework.generics import RetrieveAPIView
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Room
from .serializers import ReadRoomSerializer, WriteRoomSerializer
@api_view(["GET", "POST"]) # 허용되는 HTTP METHOD 정의
def rooms_view(request):
if request.method == "GET": # GET Method일 경우 분기
rooms = Room.objects.all() # 쿼리셋을 받아 올게요.
serializer = ReadRoomSerializer(rooms, many=True).data
return Response(serializer)
elif request.method == "POST": # POST Method일 경우 분기
serializer = WriteRoomSerializer(data=request.data)
if serializer.is_valid():
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
class SeeRoomView(RetrieveAPIView):
queryset = Room.objects.all()
serializer_class = ReadRoomSerializer
is valid()の有効性チェックを確認するために、次のPOST要求が送信されます.
いずれにしても、通常は検証後、200と400のstatusコードをResponseクラスに入れて返信すればよい.
rooms/serializers.py
前に作ったROOMSerializerをReadRoomSerializerに変更
POSTを書くためにROOMSerializerを書いてください
models.実際、pyと同じと考えられます.
ModelSerializer vs Serializer
引き継いだレベルの違いでコードの数が大きく変わることを確認できるレベルが2つありますfrom rest_framework import serializers
from users.serializers import UserSerializer
from .models import Room
class ReadRoomSerializer(serializers.ModelSerializer): # GET 요청시 처리할 시리얼라이저
user = UserSerializer()
class Meta:
model = Room
exclude = ("modified",)
class WriteRoomSerializer(serializers.Serializer): # POST요청시 처리할 시리얼라이저
name = serializers.CharField(max_length=140)
address = serializers.CharField(max_length=140)
price = serializers.IntegerField()
beds = serializers.IntegerField(default=1)
lat = serializers.DecimalField(max_digits=10, decimal_places=6)
lng = serializers.DecimalField(max_digits=10, decimal_places=6)
bedrooms = serializers.IntegerField(default=1)
bathrooms = serializers.IntegerField(default=1)
check_in = serializers.TimeField(default="00:00:00")
check_out = serializers.TimeField(default="00:00:00")
instant_book = serializers.BooleanField(default=False)
rooms/urls.pyfrom django.urls import path
from . import views
app_name = "rooms"
urlpatterns = [
path("", views.rooms_view),
path("<int:pk>/", views.SeeRoomView.as_view()),
]
FBVで作ったシリーズのアイライナーと画面が終わります
開始前のモデルpyファイルにmetaクラスのシーケンス変数の値を降順に出力するには、前にマイナス記号を付けます.
rooms/models.py photo_number.short_description = "Photo Count"
class Meta:
ordering = ["pk"]
ordering = ["-pk"]
class Photo(CoreModel):
Serializer method
デフォルトでは、Serializerクラスでcreate()、update()、save()というメソッドが使用されます.serializer.save(user=request.user)
メソッドを使用すると、基本的にcreate、updateの2種類を区別できます.
from rest_framework.generics import RetrieveAPIView
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Room
from .serializers import ReadRoomSerializer, WriteRoomSerializer
@api_view(["GET", "POST"]) # 허용되는 HTTP METHOD 정의
def rooms_view(request):
if request.method == "GET": # GET Method일 경우 분기
rooms = Room.objects.all() # 쿼리셋을 받아 올게요.
serializer = ReadRoomSerializer(rooms, many=True).data
return Response(serializer)
elif request.method == "POST": # POST Method일 경우 분기
serializer = WriteRoomSerializer(data=request.data)
if serializer.is_valid():
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
class SeeRoomView(RetrieveAPIView):
queryset = Room.objects.all()
serializer_class = ReadRoomSerializer
from rest_framework import serializers
from users.serializers import UserSerializer
from .models import Room
class ReadRoomSerializer(serializers.ModelSerializer): # GET 요청시 처리할 시리얼라이저
user = UserSerializer()
class Meta:
model = Room
exclude = ("modified",)
class WriteRoomSerializer(serializers.Serializer): # POST요청시 처리할 시리얼라이저
name = serializers.CharField(max_length=140)
address = serializers.CharField(max_length=140)
price = serializers.IntegerField()
beds = serializers.IntegerField(default=1)
lat = serializers.DecimalField(max_digits=10, decimal_places=6)
lng = serializers.DecimalField(max_digits=10, decimal_places=6)
bedrooms = serializers.IntegerField(default=1)
bathrooms = serializers.IntegerField(default=1)
check_in = serializers.TimeField(default="00:00:00")
check_out = serializers.TimeField(default="00:00:00")
instant_book = serializers.BooleanField(default=False)
from django.urls import path
from . import views
app_name = "rooms"
urlpatterns = [
path("", views.rooms_view),
path("<int:pk>/", views.SeeRoomView.as_view()),
]
photo_number.short_description = "Photo Count"
class Meta:
ordering = ["pk"]
ordering = ["-pk"]
class Photo(CoreModel):
もしあなたが私に何かをしてくれるなら、Serializerクラス定義のcreate()メソッドを使います!東!呼び出して論理を実行します.
何かを変えたら、逆にupdate()メソッドを検出して寝ることができます!東!コールで論理を実行しますか?
参照として、シーケンスRiser(インスタンス).dataは、HTTP method bodyに送信される値を示す.
rooms/views.py
...
...
@api_view(["GET", "POST"])
def rooms_view(request):
if request.method == "GET":
rooms = Room.objects.all()[:5] # 모든 객체를 보여주기에 5개만 일단 가볍게 출력
serializer = ReadRoomSerializer(rooms, many=True).data
return Response(serializer)
elif request.method == "POST":
if not request.user.is_authenticated: # 로그인 하지 않은 경우
return Response(status=status.HTTP_401_UNAUTHORIZED)
serializer = WriteRoomSerializer(data=request.data)
if serializer.is_valid():
room = serializer.save(user=request.user) # 여기서 받은 룸은 create 메소드에서 반환한 인스턴스를 말함
room_serializer = ReadRoomSerializer(room).data # 알맹이에 해당함. HTTP 메서드에서 바디로 보낸 값들과 기타등등
return Response(data=room_serializer, status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
class SeeRoomView(RetrieveAPIView):
...
...
serializer.save(user=request.user)
のキーワードパラメータは、WriteRoomSerializerクラスのcreate(self,validate data)メソッドのvalidate dataに相当する.rooms/serializers.py
...
...
class WriteRoomSerializer(serializers.Serializer):
name = serializers.CharField(max_length=140)
address = serializers.CharField(max_length=140)
price = serializers.IntegerField()
beds = serializers.IntegerField(default=1)
lat = serializers.DecimalField(max_digits=10, decimal_places=6)
lng = serializers.DecimalField(max_digits=10, decimal_places=6)
bedrooms = serializers.IntegerField(default=1)
bathrooms = serializers.IntegerField(default=1)
check_in = serializers.TimeField(default="00:00:00")
check_out = serializers.TimeField(default="00:00:00")
instant_book = serializers.BooleanField(default=False)
def create(self, validated_data):
return Room.objects.create(**validated_data)
管理者としてログイン後ある程度の魚の群れであれば、以下のように確認できます.
adminでアシストを確認します.
Reference
この問題について([drf]airbnb api - 8 Create Room), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeseong-dev/drfairbnb-api-8-Create-Roomテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol