爲何不使用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即可實現簡單的訪問