zoukankan      html  css  js  c++  java
  • 通过django的rest-framework……(CBV)

    为什么不使用FBV,因为CBV重用性很高

    先看一个例子:

    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_time

    如果json序列化中有时间类型的话,JSON就会失败,运行就会报错:

    去掉之后返回也必须指定content_type=‘application/json’。而且不好的地方还有比如写那么多字段容易写错等

    那如何解决呢?

            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)

    但是图片啊时间类型都没办法序列化?那该如何?

    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)

    通过这个代码可以完成上面所有的工作。①取到所有字段②可以序列化所有③不用一个一个写

    整体如下:

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

  • 相关阅读:
    C语言编程 两种方法打印一个菱形(渐入显示)
    Java编程格式输出中 printf 的使用实例
    C语言编程输入一个5位数以内的正整数,完成以下操作
    C语言编程判断两个矩阵是否相等(n阶矩阵)
    C语言编程输出100到200的素数的两种方法,和三步优化(逐步优化)
    Java编程中Math.random()的应用(随机生成数的应用)
    C语言编程求1X2X3····Xn所得的数末尾有多少个零
    C语言大数的阶乘
    maven构建一个简单的springboot项目
    nginx的配置
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/10029048.html
Copyright © 2011-2022 走看看