为何不使用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即可实现简单的访问