環境
- 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の部分)
おわり
コメント