DjangoのRESTフレームワークは、本質的にDjangoのAPPの、コンポーネントベースのDjangoを開発するためのフレームワークです。
安らかな仕様は、インタフェースプログラムを開発するために実装されますが、それはプログラマが迅速DRFに基づいていない安らかフォロー標準化手順を開発することができます使用することができます。
インストール
pip3 install djangorestframework
使用するのは簡単
登録したアプリの設定
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework' ]
ルート、複数の操作に対応することができる経路
from django.conf.urls import url from django.contrib import admin from api import views urlpatterns = [ url(r'^drf/info/', views.DrfInfoView.as_view()), ]
ビューCBV、クラス継承APIView
from rest_framework.views import APIView from rest_framework.response import Response class DrfInfoView(APIView): def get(self,request,*args,**kwargs): data = [ {'id': 1, 'title': '震惊了...', 'content': '...'}, return Response(data)
だから我々は、単純なDRFアプリケーションを実装しました。
DRFアプリケーションシナリオ
前后端分离项目、参与为app写接口时,用drf会比较方便。
DRFパーサ
パーサ、配置解析した後、異なるボディフォーマットのデータ分析のためのユーザの要求に応じrequest.data
ました。
解析時に、DRFは、HTTPリクエストヘッダのコンテンツタイプを読み取ります。
- コンテンツ型の場合:X-WWW-URLエンコード、プロセスは&リクエストボディに応じDRF符号分割形態を行くだろう。ユーザー=王&年齢= 19
- コンテンツ・タイプの場合:アプリケーション/ JSON、そしてそのJSON依頼フォームDRFに従って処理することになります。{ "ユーザー": "王"、 "年齢":19}
DRFシリアライズ
オブジェクトまたはオブジェクトのリスト(クエリセット)は、フォームの検証動作及び機能をシリアライズ。
シリアライザDRFモジュールは、2つの機能を提供します。
- データ検証
- 連載
from django.conf.urls import url
from django.contrib import admin
from api import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^info/$', views.InfoView.as_view()),
url(r'^drf/info/$', views.DrfInfoView.as_view()),
url(r'^drf/category/$', views.DrfCategoryView.as_view()),
url(r'^drf/category/(?P<pk>\d+)/$', views.DrfCategoryView.as_view()),
url(r'^new/category/$', views.NewCategoryViewpython.as_view()),
url(r'^new/category/(?P<pk>\d+)/$', views.NewCategoryView.as_view()),
]
from rest_framework import serializers
class NewCategorySerializer(serializers.ModelSerializer):
"""定义一个类,进行序列化"""
class Meta:
model = models.Category
# fields = "__all__"
fields = ['id','name']
class NewCategoryView(APIView):
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if not pk:
queryset = models.Category.objects.all()
ser = NewCategorySerializer(instance=queryset,many=True) # 进行数据校验,many=True表示多个对象数据
return Response(ser.data) # 返回数据
else:
model_object = models.Category.objects.filter(id=pk).first()
ser = NewCategorySerializer(instance=model_object, many=False) # many=True表示一个对象数据
return Response(ser.data)
def post(self,request,*args,**kwargs):
ser = NewCategorySerializer(data=request.data) # post请求,对提交的数据进行序列化校验
if ser.is_valid():
ser.save() # 可以直接保存到数据库中
return Response(ser.data)
return Response(ser.errors)
def put(self,request,*args,**kwargs):
pk = kwargs.get('pk')
category_object = models.Category.objects.filter(id=pk).first()
ser = NewCategorySerializer(instance=category_object,data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
return Response(ser.errors)
def delete(self,request,*args,**kwargs):
pk = kwargs.get('pk')
models.Category.objects.filter(id=pk).delete()
return Response('删除成功')
、外部キーフィールドをシリアル化、フロントエンドでの中国の選択肢を表示する方法を選択します。
ソース:ソースを見つけるには、それは例えば、選択肢のために()を追加する必要はありません、)実行ファイルは、実行ファイルが自動的に(追加するかどうかを決定します:ソースを=「get_status_display」
深さ= 1、外部キーテーブルが0-10を示しました。
フック:X1 = serializers.SerializerMethodField()
デフget_x1(自己、OBJ):
obj.xxx戻ります
objが現在のオブジェクトです。
多対多の表示:
tag_title = serializers.SerializerMethodField() def get_tag_title(self, obj): tag_obj = obj.tag.all().values('id', 'title') return tag_obj
表示フィールドのGETとPOSTの提出が同じでない場合は、あなたがして定義することができます
class FromSerializer(serializers.ModelSerializer): class Meta: model = models.Article fields = '__all__'
例:
class NewSerializer(serializers.ModelSerializer): category_name = serializers.CharField(source='category.name', required=False) # required=False 表示可以不用提交数据 status_choice = serializers.CharField(source='get_status_display', required=False) # x1 = serializers.SerializerMethodField() # x2 = serializers.SerializerMethodField() tag_title = serializers.SerializerMethodField() class Meta: model = models.Article fields = ['title', 'summary', 'content', 'category', 'category_name', 'status', 'status_choice', 'tag', 'tag_title'] # depth = 1 # def get_x1(self, obj): # return obj.category.name # # def get_x2(self, obj): # return obj.get_status_display() def get_tag_title(self, obj): tag_obj = obj.tag.all().values('id', 'title') return tag_obj