zoukankan      html  css  js  c++  java
  • 前后端分离电商,业务逻辑部份

    先说一下传统的前后端分离,,

    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)
    View Code

    热身完毕,framework   api  教程正式开始

    framework  简称为   rest   

    安装必要的组件:

     详情可以查看官网

    这儿共需要三步,第一新建访问路由

            第二,新建验证,规格,序列化文件,似于原生的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步就能全部定完字段
    1. class GoodsSerializer(serializers.ModelSerializer):  //定义一个类
    2.     category = CategorySerializer()  // 得到模型库的模型
    3.   
    4.     class Meta:  
    5.         model = Goods  
    6.        fields = ('name', 'click_num', 'market_price', 'add_time') // 配置需要格式化的字段,如果是全部,可以使用  fields = "__all__"  
    7.        #  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__"            #得到所有 字段








  • 相关阅读:
    ubuntu升级显卡驱动
    __slots__属性,声明实力属性名字列表
    isinstance 与 type 的区别
    conda使用技巧
    卷积神经网络参数
    apache nginx php不显示版本号
    30个实用的Linux find命令示例
    账号的管理的那点事
    Linux 命令整理 —— 基本操作
    Linux 命令整理 —— 用户管理
  • 原文地址:https://www.cnblogs.com/fgxwan/p/9956624.html
Copyright © 2011-2022 走看看