[drf]airbnb api - 8 Create Room


以前に作成したすべてのAPIViewを除去し,根源論理を理解するために,メニュー化して返すことを試みた.
すなわち,ノダは符号化に近い方式を用いる.
ああ!参考になるところは自動で掴みますか?ページ名をいちいち書き出す
どうして.ページ名を実装するために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.py
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
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.py
from 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種類を区別できます.

  • もしあなたが私に何かをしてくれるなら、Serializerクラス定義のcreate()メソッドを使います!東!呼び出して論理を実行します.

  • 何かを変えたら、逆にupdate()メソッドを検出して寝ることができます!東!コールで論理を実行しますか?
  • 結論:ビューロジックはcreate()とupdate()メソッドを呼び出しません!save()メソッドを使用!
    参照として、シーケンス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でアシストを確認します.