慕西商城开发笔记(二:后端商品菜单分类)

49 阅读3分钟

商品菜单分类

一级菜单

menu/views

from django.http import HttpResponse
from django.shortcuts import render
from django.views import View

from apps_shop.menu.models import MainMenu


# Create your views
class GoodsMainMenu(View):
    def get(self,request):
        print('get')
        # 获取表里的数据
        main_menu=MainMenu.objects.all()
        return HttpResponse(main_menu)

    def post(self,request):
        print('post')
        return HttpResponse('post')

运行程序报错:RuntimeError: Model class apps_shop.menu.models.MainMenu doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

此时我们需要修改:menu/apps,将name加上我们文件夹的名字

image.png

class MenuConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps_shop.menu'

并且不要忘记在settings的INSTALLED_APPS里写上menu

获取成功:

image.png

手动序列化

因为我们发现get得到的结果的形式不是我们想要的,所以我们这里要对数据进行一些处理 menu/model

# 在GoodsMainMenu类当中添加
# 在这里我们自己手动序列化
def __str__(self):
    result = {}
    result['main_menu_id'] = self.main_menu_id
    result["main_menu_name"] = self.main_menu_name
    result["main_menu_url"] = self.main_menu_url
    return json.dumps(result, ensure_ascii=False)
  • json.dumps() 函数是将 Python 对象转换为 JSON 格式的字符串。其中,第一个参数 result 是要转换的 Python 对象,可以是字典、列表等可序列化的对象;第二个参数 ensure_ascii=False 可以保证输出中文

返回格式:

image.png

menu/view

class GoodsMainMenu(View):
    def get(self, request):
        print('get')
        # 获取表里的数据
        main_menu = MainMenu.objects.all()
        result_list=[]
        result_json={}
        for m in main_menu:
            result_list.append(m.__str__())

        result_json['status']=1000
        result_json['data']=result_list
        return HttpResponse(json.dumps(result_json),content_type="application/json")

    def post(self, request):
        print('post')
        return HttpResponse('post')

到此,就可以获得所需要的格式数据

二级菜单

二级菜单的逻辑和一级菜单逻辑差不多,多了一个,因为我们需要根据一级菜单的参数来请求二级菜单的名单,所以这里会多一个参数 menu/model

def __str__(self):
    result = {}
    result["main_menu_id"] = self.main_menu_id
    result["sub_menu_id"] = self.sub_menu_id
    result["sub_menu_type"] = self.sub_menu_type
    result["sub_menu_name"] = self.sub_menu_name
    return json.dumps(result, ensure_ascii=False)

menu/views

class GoodsSubMenu(View):
    def get(self,request):
        param_id=request.GET("main_menu_id")

        sub_menu=SubMenu.objects.filter(main_menu_id=param_id)
        result_list = []
        result_json = {}
        for m in sub_menu:
            result_list.append(m.__str__())

        result_json['status'] = 1000
        result_json['data'] = result_list
        return HttpResponse(json.dumps(result_json), content_type="application/json")

urls记得配置

from apps_shop.menu.views import GoodsMainMenu,GoodsSubMenu
urlpatterns = [
    path('admin/', admin.site.urls),
    path('main_menu/',GoodsMainMenu.as_view()),
    path('sub_menu/',GoodsSubMenu.as_view())
]

as_view()

as_view是

封装一个统一响应的请求方法

根目录下新建一个utils,用来专门存放我们封装的工具

新建ResponseMessage:

import json
from django.http import HttpResponse
# 菜单成功的状态码1000
# 失败了1002
# 不确定1003
class MenuResponse():

    @staticmethod
    def success(data):
        return  HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")

    @staticmethod
    def failed(data):
        return  HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")

    @staticmethod
    def other(data):
        return  HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")
  • @staticmethod:静态方法,这些方法可以直接通过类名调用,而无需创建类的实例

装饰器

可以在不必修改原始代码的情况下,动态地扩展、修改或包装函数或类的行为。 举个栗子:

def my_decorator(func): 
    def wrapper(): 
        print("Before function execution") 
        func() 
        print("After function execution") 
    return wrapper 

@my_decorator 
def my_function(): 
    print("Inside my_function") 

my_function()

执行结果:

Before function execution
Inside my_function
After function execution

问题:

TypeError: dump() missing 1 required positional argument: 'fp'

解决:报错是因为json.dumps写错了,写成json.dump了