一.商品列表页
1.1 goods下创建view_base.py
①.将所有字段序列化
from goods.models import Goods from django.views.generic import View class GoodsListView(View): def get(self, request): # 通过django的view实现商品列表页 json_list = [] # 获取所有商品 goods = Goods.objects.all() # 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_list.append(json_dict) ‘‘‘ model_to_dict Object of type ImageFieldFile is not JSON serializable `````````````` add_time ````````````` from django.forms.models import model_to_dict for good in goods: json_dict = model_to_dict(good) json_list.append(json_dict) ‘‘‘ ‘‘‘ django serializer from django.core import serializers from django.http import JsonResponse import json json_data = serializers.serialize(‘json‘,goods) json_data = json.loads(json_data) return JsonResponse(json_data,safe=False) ‘‘‘ from django.http import HttpResponse # 只能转换dict和list类型 import json # 返回json,一定要指定类型content_type=‘application/json‘ return HttpResponse(json.dumps(json_list), content_type=‘application/json‘)
1.2 APIview实现列表页
①.url添加文档,RF路由
from django.urls import path,include,re_path import xadmin from django.views.static import serve from RcShop.settings import MEDIA_ROOT # from goods.view_base import GoodsListView from rest_framework.documentation import include_docs_urls from goods.views import GoodsListViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() #配置goods的url router.register(r‘goods‘, GoodsListViewSet) urlpatterns = [ path(‘xadmin/‘, xadmin.site.urls), path(‘api-auth/‘,include(‘rest_framework.urls‘)), path(‘ueditor/‘,include(‘DjangoUeditor.urls‘ )), #文件 path(‘media/<path:path>‘,serve,{‘document_root‘:MEDIA_ROOT}), #drf文档,title自定义 path(‘docs‘,include_docs_urls(title=‘Rc生鲜‘)), #商品列表页 re_path(‘‘, include(router.urls)), ]
1.3 goods下新建过滤器文件
①.view.py
from rest_framework.views import APIView from goods.serializers import GoodsSerializer from .models import Goods from rest_framework.response import Response from rest_framework import mixins from rest_framework import generics from rest_framework.pagination import PageNumberPagination from rest_framework import viewsets from .filters import GoodsFilter from django_filters.rest_framework import DjangoFilterBackend from rest_framework import filters class GoodsPagination(PageNumberPagination): ‘‘‘ 商品列表自定义分页 ‘‘‘ #默认每页显示的个数 page_size = 10 #可以动态改变每页显示的个数 page_size_query_param = ‘page_size‘ #页码参数 page_query_param = ‘page‘ #最多能显示多少页 max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet): ‘商品列表页‘ #这里必须要定义一个默认的排序,否则会报错 queryset = Goods.objects.all() # 分页 pagination_class = GoodsPagination #序列化 serializer_class = GoodsSerializer filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter) # 设置filter的类为我们自定义的类 #过滤 filter_class = GoodsFilter #搜索,=name表示精确搜索,也可以使用各种正则表达式 search_fields = (‘=name‘,‘goods_brief‘) #排序 ordering_fields = (‘sold_num‘, ‘add_time‘)
②.filters.py
import django_filters from django.db.models import Q from .models import Goods class GoodsFilter(django_filters.rest_framework.FilterSet): ‘‘‘ 商品过滤的类 ‘‘‘ #两个参数,name是要过滤的字段,lookup是执行的行为,‘小与等于本店价格’ price_min = django_filters.NumberFilter(field_name="shop_price", lookup_expr=‘gte‘) price_max = django_filters.NumberFilter(field_name="shop_price", lookup_expr=‘lte‘) name = django_filters.CharFilter(field_name="name", lookup_expr=‘icontains‘) top_category = django_filters.NumberFilter(field_name="top_category", method=‘top_category_filter‘) def top_category_filter(self, queryset, name, value): # queryset = queryset.filter(Q(category_id=value)|Q(category__parent_category_id=value)|Q(category__parent_category__parent_category_id=value)) return queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) | Q( category__parent_category__parent_category_id=value)) class Meta: model = Goods fields = [‘price_min‘,‘price_max‘,‘name‘,‘top_category‘,‘is_hot‘,‘is_new‘]
二.商品数据展示
2.1 商品接口序列化
①.创建序列化文件
from rest_framework import serializers from django.db.models import Q from .models import Goods, GoodsCategory, GoodsImage, Banner, IndexAd, GoodsCategoryBrand class CategorySerializer3(serializers.ModelSerializer): class Meta: model = GoodsCategory fields = ‘__all__‘ class CategorySerializer2(serializers.ModelSerializer): sub_cat = CategorySerializer3(many=True) class Meta: model = GoodsCategory fields = ‘__all__‘ class CategorySerializer(serializers.ModelSerializer): sub_cat = CategorySerializer2(many=True) class Meta: model = GoodsCategory fields = ‘__all__‘ class GoodsSerializer(serializers.ModelSerializer): # 覆盖原来只有id的类别 category = CategorySerializer() class Meta: model = Goods fields = ‘__all__‘
②.view.py 增加
class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): ‘‘‘ list: 商品分类列表数据 ‘‘‘ queryset = GoodsCategory.objects.filter(category_type=1) serializer_class = CategorySerializer
③.urls添加
# 配置Category的url router.register(r‘categorys‘, CategoryViewSet, basename="categorys")
2.2 展示内容
①.添加中间件
MIDDLEWARE = [ ‘corsheaders.middleware.CorsMiddleware‘, ‘django.middleware.security.SecurityMiddleware‘, ‘django.contrib.sessions.middleware.SessionMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, ‘django.middleware.csrf.CsrfViewMiddleware‘, ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, ‘django.contrib.messages.middleware.MessageMiddleware‘, ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘, ]
②.设置为True
CORS_ORIGIN_ALLOW_ALL = True
③.导航栏设置 # 想在导航栏展示的类目,勾选即可
原文:https://www.cnblogs.com/JangNara/p/12988745.html