django DRF まとめ

投稿者: Auther | 10 ヶ月, 3 週間 前 |

説明が入ると個々のファイルがバラバラになり、関係性が見えなくなるため、説明を最小限コード内に書いた。

ポイントは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')), # 追加
]

現在未評価