經過django的rest-framework……(CBV)

爲何不使用FBV,由於CBV重用性很高數據庫

先看一個例子:django

from django.views.generic.base import View
from django.http import HttpResponse, JsonResponse
from goods.models import Goods
import json
# from django.views.generic import ListView


class GoodsListView(View):
    def get(self, request):
        """
        經過django的view實現商品列表頁
        :param request:
        :return:
        """
        json_list = []
        goods = Goods.objects.all()[:10]
        for good in goods:
            json_dict = {}
            json_dict["name"] = good.name
            json_dict["category"] = good.category.name
            json_dict["market_price"] = good.market_price
            json_dict["add_time"] = good.add_time
            json_list.append(json_dict)
        return HttpResponse(json.dumps(json_list), content_type='application/json')  # 使用HTTPResponse返回json數據,必須指定content_type

經過上面咱們能夠看到的是先從django中引入View類,以後經過json的方式返回。這彷佛沒有問題,只要去掉add_timejson

若是json序列化中有時間類型的話,JSON就會失敗,運行就會報錯:api

去掉以後返回也必須指定content_type=‘application/json’。並且很差的地方還有好比寫那麼多字段容易寫錯等session

那如何解決呢?app

        from django.forms.models import model_to_dict  # django提供的方法將全部字段變成一個dict
        for good in goods:
            json_dict = model_to_dict(good)
            json_list.append(json_dict)

可是圖片啊時間類型都沒辦法序列化?那該如何?cors

from django.core import serializers

django提供的這個模塊是專門用來實現序列化的函數

        import json
        from django.core import serializers
        json_data = serializers.serialize('json', goods)  # 這個直接傳入questset
        json_data = json.loads(json_data)
        from django.http import HttpResponse, JsonResponse
        return JsonResponse(json_data, safe=False)

經過這個代碼能夠完成上面全部的工做。①取到全部字段②能夠序列化全部③不用一個一個寫ui

總體以下:url

from django.views.generic.base import View

from goods.models import Goods
# from django.views.generic import ListView


class GoodsListView(View):
    def get(self, request):
        """
        經過django的view實現商品列表頁
        :param request:
        :return:
        """
        json_list = []
        goods = Goods.objects.all()[:10]
        # for good in goods:
        #     json_dict = {}
        #     json_dict["name"] = good.name
        #     json_dict["category"] = good.category.name
        #     json_dict["market_price"] = good.market_price
        #     json_dict["add_time"] = good.add_time
        #     json_list.append(json_dict)

        from django.forms.models import model_to_dict  # django提供的方法將全部字段變成一個dict
        for good in goods:
            json_dict = model_to_dict(good)
            json_list.append(json_dict)

        import json
        from django.core import serializers
        json_data = serializers.serialize('json', goods)  # 這個直接傳入questset
        json_data = json.loads(json_data)
        from django.http import HttpResponse, JsonResponse
        return JsonResponse(json_data, safe=False)

django-rest-framework名稱太長了,下面檢查drf

首先是安裝官方文檔中的安裝

值得注意的是要想drf生成文檔,必須在django的url配置

from rest_framework.documentation import include_docs_urls
urlpatterns = [
    url(r'docs/', include_docs_urls(title="文檔")),]

注意,千萬不要在docs後面加上$,名稱能夠隨意命名!

而後將rest-framework配置到settings中

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users.apps.UsersConfig',
    'DjangoUeditor',
    'goods.apps.GoodsConfig',
    'trade.apps.TradeConfig',
    'user_operation.apps.UserOperationConfig',
    'crispy_forms',
    'django_filters',
    'xadmin',
    'rest_framework',  # 必定要配置,否則會報錯
    'corsheaders',
    'rest_framework.authtoken'
]

在一步一步跟着官方文檔進行

這個在後期調試API的時候會用到的

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),

在這邊給他加了一個命名空間,方便反向查詢。

 看一個例子:

1,首先像Form組件同樣新建一個py文件

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/6 23:19'

from rest_framework import serializers


class GoodsSerializer(serializers.Serializer):  # 針對Goods的字段,相似Form組件,類名規則爲models表名+Serializer
    name = serializers.CharField(required=True, max_length=100)  # 是否必須
    click_num = serializers.IntegerField(default=0)

由於Goods表中字段過多,所以只去兩個作示範

是否是和Form組件很是像!

但須要注意的是:

1,類的命名必須是models中寫的表名+Serializer

2,對於字段的調用能夠隨意安排,沒必要要所有寫入(固然展現的也僅僅是這兩個字段)

第二步:

from .serializers import GoodsSerializer
from .models import Goods
from rest_framework.views import APIView
from rest_framework.response import Response
class GoodsViews(APIView):
    def get(self, request, format=None):
        goods = Goods.objects.all()[:10]
        goods_json = GoodsSerializer(goods, many=True)  # 若是goods只是單個queryset的話,即可沒必要加many=True
        return Response(goods_json.data)  # 參數data就是完成以後的存儲地方

在django的視圖函數中寫入判斷邏輯,注意點:

1,若是從數據庫中取到只是單個queryset的話,即可沒必要加many=True

2,經過Serializer中的data能夠獲取處處理以後的Json內容

而後本身配置url即可實現簡單的訪問

相關文章
相關標籤/搜索