DjangoのRESTフレームワーク知人

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('删除成功')

、外部キーフィールドをシリアル化、フロントエンドでの中国の選択肢を表示する方法を選択します。

  1. ソース:ソースを見つけるには、それは例えば、選択肢のために()を追加する必要はありません、)実行ファイルは、実行ファイルが自動的に(追加するかどうかを決定します:ソースを=「get_status_display」

  2. 深さ= 1、外部キーテーブルが0-10を示しました。

  3. フック:X1 = serializers.SerializerMethodField()

    デフget_x1(自己、OBJ):

    obj.xxx戻ります

    objが現在のオブジェクトです。

  4. 多対多の表示:

    tag_title = serializers.SerializerMethodField()
    
    def get_tag_title(self, obj):
        tag_obj = obj.tag.all().values('id', 'title')
    
        return tag_obj
  5. 表示フィールドの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

おすすめ

転載: www.cnblogs.com/yzm1017/p/11938726.html