Django Rest Framework - 前回のプロジェクトを開始する前に知っておきたい基本事項


アイデアは、Django のモデルに基づいて API エンドポイントを設定する方法をすべて収集し、何らかのチート シートを作成することです.

Django で動作させるには、3 つのことが必要です.シリアライザーとビューを備えたある種のモデル.次に、それを URL に接続すると、出来上がりです!一歩一歩作っていきましょう.

モデル



ここには特別なものはありません.ただの記事です.次のポイントにスキップしてください 😉.

// models.py
from django.db import models
from django.contrib.auth import get_user_model

UserModel = get_user_model()

class Article(models.Model):
    author = models.ForeignKey(UserModel, on_delete=models.SET_NULL, null=True)
    title = models.CharField(max_length=50)
    text = models.CharField(max_length=100)


シリアライザー



Serializer は、モデル インスタンスを JSON に変換して戻すクラスです.それがどのように機能するかに焦点を当てたくはありませんが、以下に rest_framework serializers のいくつかの機能を見つけることができます.

すべてのフィールドを指定しないでください



すべてのフィールドをシリアル化する場合は __all__ を使用します

// serializers.py 
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = "__all__"

{
    "id": 1,
    "title": "sample title 1",
    "text": "sample article text",
    "author": 1
}


除外



単一のフィールド (パスワードなど) を除外する場合は、exclude = [list of fields to exclude ] を使用できます

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        exclude = ["author"]

{
    "id": 1,
    "title": "sample title 1",
    "text": "sample article text",
}


深さ



応答は作成者 PK で提供されます.外部キーとして指定されたフィールドの詳細を取得したい場合は、 depth = 1 を使用します.
次に、もう 1 レベルシリアライズします.作成者モデルにも外部キー フィールドがあり、深さが 2 に等しい場合、それもシリアル化されます.

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = "__all__"
        depth = 1

{
  "id": 1,
  "title": "sample title 1",
  "text": "sample article text",
  "author": {
      "id": 1,
      "last_login": "2021-06-14T07:19:30.612463Z",
      "is_superuser": true,
      "username": "admin",
      "first_name": "",
      "last_name": "",
      "email": "[email protected]",
      "is_staff": true,
      "is_active": true,
      "date_joined": "2021-06-14T07:13:58.546066Z",
      "groups": [],
      "user_permissions": []
  }
}


逆シリアル化



User モデルのシリアライザーを作成し、彼が書いた記事を知りたいと想像してください.ユーザー モデルには「記事」のようなフィールドがなく、記事モデルには「作成者」フィールドでユーザー モデルとの関係があるため、次のようにユーザー モデル シリアライザーでフィールドを指定できます.

 fields = ("id", "all other fields", "article_set" )


理解を深めるために、Django シェルで試してみてください.

>>> from django.contrib.auth import get_user_model
>>> UserModel = get_user_model()       
>>> admin = UserModel.objects.all( )[0] 
>>> admin                 
<User: admin>
>>> admin.email
'[email protected]'
>>> admin.articles_set.all( ) 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'articles_set'
>>> admin.article_set.all( )   
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>


ビュー



モデルのビューを生成するには、 generic views を使用します.

これを機能させるには、GenericViewSet から継承するクラスと、メソッド POST、GET、PUT、PATCH、DELETE を実装するクラスを作成する必要があります.

from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, UpdateModelMixin, CreateModelMixin, DestroyModelMixin
from rest_framework.viewsets import GenericViewSet


class ArticleView(GenericViewSet, ..... ):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


serializer_class フィールドと queryset フィールドを追加することを忘れないでください.または、 get_queryset( ) メソッドまたは get_serializer_class( ) を定義できます.

リストビュー



メソッド GET をビューに追加して、すべてのリソース (クエリセット) を一覧表示します.動作をオーバーライドまたは拡張するには、.list(request, *args, **kwargs) メソッドを使用します.

GET localhost:8000/api/articles



// views.py 
class ArticleView(GenericViewSet, ListModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


詳細ビュー (取得ビュー)



単一のエンティティに関する詳細情報を提供するメソッド GET を View に追加します.動作をオーバーライドまたは拡張するには、.retrieve(request, *args, **kwargs) メソッドを使用します.

GET localhost:8000/api/articles/{article pk}



// views.py 
class ArticleView(GenericViewSet, RetrieveModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


ビューの更新



ビューに 2 つのメソッドを追加します. PUT と PATCH. PUT リクエストを使用してすべてのフィールドを更新し、PATCH リクエストを部分的な更新として使用します.動作をオーバーライドまたは拡張するには、PATCH に .update(request, *args, **kwargs)" method or ".partial_update(request, *args, **kwargs) を使用します.

PUT localhost:8000/api/articles/{article pk}   
body: data to update as json representation of obj. 

PATCH localhost:8000/api/articles/{article pk}
body: data to update as json with fields we want to update



class ArticleView(GenericViewSet, UpdateModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


ビューを作成



メソッド POST をビューに追加します.動作をオーバーライドまたは拡張するには、.create(request, *args, **kwargs) メソッドを使用します.

POST localhost:8000/api/articles
body: json representation of obj to create 



class ArticleView(GenericViewSet, CreateModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


ビューを破壊する



ビューにメソッド DELETE を追加します.モデル インスタンスの削除を提供します.動作をオーバーライドまたは拡張するには、.destroy(request, *args, **kwargs) メソッドを使用します.

DELETE localhost:8000/api/articles/{article pk}



class ArticleView(GenericViewSet, DestroyModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()



注目すべきものを見つけたら、この記事を更新します.多分あなたはいくつかのアイデアを持っていますか? 😉

最初に公開された場所: jakubszwajka