经过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即可实现简单的访问

相关文章
相关标签/搜索