説明が入ると個々のファイルがバラバラになり、関係性が見えなくなるため、説明を最小限コード内に書いた。
ポイントはuuid
models.py
import uuid
from django.db import models
from django.utils import timezone
class Book(models.Model):
class Meta:
db_table = 'book'
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(verbose_name='タイトル', max_length=20)
price = models.IntegerField(verbose_name='価格', null=True)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
serializers.py
シリアライズ:オブジェクトから文字列に変換すること
from rest_framework import serializers
from shop.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book # 対象のモデルクラス
fields = ['id', 'title', 'price'] # 利用するフィールド名
# 複数のbookを扱う
class BookListSerializer(serializers.ListSerializer):
child = BookSerializer()
views.py
JSONのリクエストオブジェクトを受け取り、API呼び出しに対応するアクションを実行して、JSONのレスポンスオブジェクトを作成する
from rest_framework import genirics
from .serializers import BookSerializer
class BookCreateAPIView(generics.CreateAPIview):
"""単一モデル対象のAPI"""
serializer_class = BookSerializer
シリアライズのインスタンス化、バリデーション、モデルオブジェクトの保存、Resonseオブジェクトの返却
URLconf
汎用APIViewの場合
view.py
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from shop.models import Book
from .serializers import BookSerializer
class BookListCreatAPIView(generics.ListCreateAPIView):
"""一覧表示用"""
serializer_class = BookSerializer
queryset = Book.objects.all()
class BookRetrieveAPIView(generics.RetrieveAPIView):
"""詳細表示用"""
serializer_class = BookSerializer
queryset = Book.objects.all()
urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('api/v1/books', views.BookListCreateAPIView.as_view()),
path('api/v1/books/<pk>', views.BookRetrieveAPIView.as_view()),
]
proj/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import path, include # 追加
# アプリケーションを追加したときのみ追加する
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('books.urls')), # 追加
path('api/', include('api.urls')), # 追加
]