首页 > 其他 > 详细

生鲜超市项目(二)

时间:2020-05-29 18:45:41      阅读:52      评论:0      收藏:0      [点我收藏+]

一.商品列表页

 

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)
view_base.py

 

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(rgoods, 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)),
]
urls.py

 

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)
view.py

 

②.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]
filter.py

 

二.商品数据展示

 

  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(rcategorys, 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!