Django Rest Framework - 前回のプロジェクトを開始する前に知っておきたい基本事項
アイデアは、Django のモデルに基づいて API エンドポイントを設定する方法をすべて収集し、何らかのチート シートを作成することです.
Django で動作させるには、3 つのことが必要です.シリアライザーとビューを備えたある種のモデル.次に、それを URL に接続すると、出来上がりです!一歩一歩作っていきましょう.
ここには特別なものはありません.ただの記事です.次のポイントにスキップしてください 😉.
Serializer は、モデル インスタンスを JSON に変換して戻すクラスです.それがどのように機能するかに焦点を当てたくはありませんが、以下に
すべてのフィールドをシリアル化する場合は
単一のフィールド (パスワードなど) を除外する場合は、
応答は作成者 PK で提供されます.外部キーとして指定されたフィールドの詳細を取得したい場合は、
次に、もう 1 レベルシリアライズします.作成者モデルにも外部キー フィールドがあり、深さが 2 に等しい場合、それもシリアル化されます.
User モデルのシリアライザーを作成し、彼が書いた記事を知りたいと想像してください.ユーザー モデルには「記事」のようなフィールドがなく、記事モデルには「作成者」フィールドでユーザー モデルとの関係があるため、次のようにユーザー モデル シリアライザーでフィールドを指定できます.
理解を深めるために、Django シェルで試してみてください.
モデルのビューを生成するには、 generic views を使用します.
これを機能させるには、
メソッド GET をビューに追加して、すべてのリソース (クエリセット) を一覧表示します.動作をオーバーライドまたは拡張するには、
単一のエンティティに関する詳細情報を提供するメソッド GET を View に追加します.動作をオーバーライドまたは拡張するには、
ビューに 2 つのメソッドを追加します. PUT と PATCH. PUT リクエストを使用してすべてのフィールドを更新し、PATCH リクエストを部分的な更新として使用します.動作をオーバーライドまたは拡張するには、PATCH に
メソッド POST をビューに追加します.動作をオーバーライドまたは拡張するには、
ビューにメソッド DELETE を追加します.モデル インスタンスの削除を提供します.動作をオーバーライドまたは拡張するには、
注目すべきものを見つけたら、この記事を更新します.多分あなたはいくつかのアイデアを持っていますか? 😉
最初に公開された場所: jakubszwajka
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
Reference
この問題について(Django Rest Framework - 前回のプロジェクトを開始する前に知っておきたい基本事項), 我々は、より多くの情報をここで見つけました https://dev.to/kuba_szw/django-rest-framework-basics-i-wish-to-know-before-i-started-last-project-2agpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol