先说一下传统的前后端分离,,
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)
#导入HttpResponse, JsonResponse 模块 #导入json import json from django.http import HttpResponse, JsonResponse return HttpResponse(json.dumps(json_list),content_type="application")
为了方便试,浏览器安装json,vive,显示效果更好,以上的方法痛点很多:不能对tim序例化,手工填充对象,类似于下面的步聚太多,容易出错
json_dict["category"] = good.category.name
json_dict["market_price"] = good.market_price
json_dict["add_time"] = good.add_time
我们使用 django自带的 model_to_dict 来做这种json 我们不需要手工序例化数据,方便一些
将对象转成json:
goods = Goods.objects.all()[:10]
from django .forms.models import model_to_dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict)
from django.http import HttpResponse, JsonResponse
return HttpResponse(json.dumps(json_list),content_type="application")
只是没有手工初始数据而己,总数据要循环,然后追加,仍然不能序例化
最后一个超级变态方法,不要初始,不要循环,serializera的方法
from .models import Goods
from django.views.generic.base import View
class GoodsListView(View):
def get(self,request):
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["maret_price"]=good.market_price
# json_list.append(json_dict)
#
# from django .forms.models import model_to_dict
# for good in goods:
# json_dict = model_to_dict(good)
# json_list.append(json_dict) // 带*这些都不需要
from django.core import serializers
import json
json_data = serializers.serialize("json",goods)
from django.http import HttpResponse
import json
return HttpResponse(json.dumps(json_data), content_type="application")
但是也要指定类型,我们用专用的jsonResponse更方便,,,
........................完整代码如下:因为是例子,导入包是是现用现导,方便学习:
class GoodsListView(View): def get(self, request): json_list = [] goods = Goods.objects.all()[:10] from django.forms.models import model_to_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) json_data = json.loads(json_data) from django.http import HttpResponse, JsonResponse return JsonResponse(json_data, safe=False)
热身完毕,framework api 教程正式开始
framework 简称为 rest
安装必要的组件:
详情可以查看官网
- coreapi(1.32.0+) - 支持文档各种模式生成。
- Markdown(2.1.0+) - 可浏览API的Markdown支持。
- django-filter(1.0.1+) - 过滤支持。
- django-crispy-forms - 改进的HTML显示过滤。
- django-guardian(1.1.1+) - 对象级权限支持。
这儿共需要三步,第一新建访问路由
第二,新建验证,规格,序列化文件,似于原生的form
第三步,vies视图数
路由页面:
from rest_framework.documentation import include_docs_urls
from django.urls import path,include
from goods.views import GoodsListView
import xadmin
urlpatterns = [
path('xadmin/', xadmin.site.urls), #后台地址
path('docs/',include_docs_urls(title = "bxy")), #自动生成文档需要
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),#框架内部使用
path("goods/",GoodsListView.as_view(),name = "goods-list"),#用户视图
]
2,在 当前的app 中新建一个serializer.py 类似于原生form,验证使用:
from rest_framework import serializers
#这儿和原生的form 没有区别,只是多了一个关健字
class GoodsSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100, required=True)
click_num = serializers.IntegerField(default=0)
3:视图函数部份
from .serializer import GoodsSerializer #导入验证模块
from rest_framework.views import APIView #导入视图模块
from rest_framework.response import Response #渲染模块
from .models import Goods
class GoodsListView(APIView):
def get(self,request,format = None):
goods = Goods.objects.all()[:10]
goods_serializer = GoodsSerializer(goods,many = True)
return Response(goods_serializer.data)
以上serializer 方法,需要定义很字段属性,有没有像modelform 一样有提供自动的方法呢,只需6步就能全部定完字段
- class GoodsSerializer(serializers.ModelSerializer): //定义一个类
- category = CategorySerializer() // 得到模型库的模型
- class Meta:
- model = Goods
- fields = ('name', 'click_num', 'market_price', 'add_time') // 配置需要格式化的字段,如果是全部,可以使用 fields = "__all__"
- # fields = "__all__"
如查是关联有外健的表怎么查呢:可以分别定义,然后在主健那表,单独自定义一定字段用于记录:
from rest_framework import serializers #导入serializers包
from goods.models import Goods, GoodsCategory #导入模型库
class CategorySerializer(serializers.ModelSerializer): #定义一个类放的是外健那个表的数据据
class Meta:
model = GoodsCategory #得到模型库的数据
fields = "__all__"
class GoodsSerializer(serializers.ModelSerializer): #定义一个类,主健
category = CategorySerializer() # 得到外健那个类,保存在一个字段
class Meta:
model = Goods #得到模型库GOODs的数据
# fields = ('name', 'click_num', 'market_price', 'add_time')
fields = "__all__" #得到所有 字段