【Django】DRFにて登録・更新のAPIを作成し、post・putリクエストを行う方法

Django
 

環境

  • Python 3.8
  • Django 3.1.3
  • DRF 3.12.2

実装方法

役割単位でファイルを分けるのがDRFの一般的な実装思考です。

主には4つに分けて実装しています。

  • models テーブルの定義
  • views フロント側とのリクエスト形式(GET,POST,PUT…)を定義
  • urls APIにアクセスするパスの設定
  • serializer フロントから受け取ったデータをサーバー側で利用しやすくするように加工する

互いの依存関係をなるべく少なくするのが一般的です。

例えばserializerにてviewsの定義をしても動くことは動くのですが、DRFの思考には合いません。

合わないのがなぜいけないかというとズバリ「自分しか理解できないコードが生まれてしまう」からです。

まずは、「model,view,url」を定義していきます。

models.py

from django.db import models

class VendorInfo(models.Model):
    address = models.CharField(max_length=200)
    longitude = models.DecimalField(max_digits=17, decimal_places=14)
    latitude = models.DecimalField(max_digits=17, decimal_places=14)
    created_at = models.DateField(auto_now=True)
    
    def __str__(self):
        return self.address

views.py

from rest_framework import generics
from jobs.api.serializers import DrinksSerializer, VendorInfoSerializer
from jobs.models import VendorInfo, Drinking

# Create your views here.
class ListView(generics.ListCreateAPIView):
    queryset = VendorInfo.objects.all().order_by('-id')
    serializer_class = VendorInfoSerializer

class DetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = VendorInfo.objects.all()
    serializer_class = VendorInfoSerializer

urls.py

from django.urls import path
from .. import views

urlpatterns = [
    path('vendors', views.ListView.as_view(), name='list'),
    path('vendors/<int:pk>', views.DetailView.as_view(), name='detail'),
]

登録処理

createメソッドをオーバーライドすることでPOSTリクエストを実現することができます。

createメソッドの第2引数のvalidated_dataにてリクエストデータを受け取り、modelのインスタンスに格納しています。

これによりPOSTでの登録処理を実現しています。

from ctypes import addressof
from multiprocessing import context
from rest_framework import serializers
from jobs.models import VendorInfo

class VendorInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = VendorInfo
        fields = '__all__'

    def create(self, validated_data):
        newVendor = VendorInfo.objects.create(
            address = validated_data["address"],
            latitude = validated_data["latitude"],
            longitude = validated_data["longitude"],
        )
        newVendor.save()
        return newVendor

上記を定義したのちにPostmanでPOSTリクエストのAPIを叩いてみましょう。

更新処理

updateメソッドをオーバーライドしてあげることでPUTリクエストを実現することができます。

createとは引数の数が違うので注意が必要です。

from ctypes import addressof
from multiprocessing import context
from rest_framework import serializers
from jobs.models import VendorInfo

class VendorInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = VendorInfo
        fields = '__all__'

    def create(self, validated_data):
        newVendor = VendorInfo.objects.create(
            address = validated_data["address"],
            latitude = validated_data["latitude"],
            longitude = validated_data["longitude"],
        )
        newVendor.save()
        return newVendor

    def update(self, instance, validated_data):
        instance.address = validated_data["address"]
        instance.latitude = validated_data["latitude"]
        instance.longitude = validated_data["longitude"]
        instance.save()
            
        return instance

上記を定義したのちにPostmanでPUTリクエストのAPIを叩きましょう。

ここでも1つ注意があります。

PUTリクエストの際は必ずupdate対象のレコードのKeyをURLに入力しなければなりません。(今回で言う1の部分)

おわり

コメント

タイトルとURLをコピーしました