码迷,mamicode.com
首页 > 其他好文 > 详细

通过django的rest-framework……(CBV)

时间:2018-11-27 22:05:17      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:def   headers   rsh   技术   ali   alt   auth   9.png   检查   

为什么不使用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(rdocs/, 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)),

在这边给他加了一个命名空间,方便反向查询。

 

通过django的rest-framework……(CBV)

标签:def   headers   rsh   技术   ali   alt   auth   9.png   检查   

原文地址:https://www.cnblogs.com/zhoulixiansen/p/10029048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!