第一步:其实,之前已经定义好了
C:\Users\huang\PycharmProjects\MxShop\apps\goods\serializers.py
from rest_framework import 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
# fields = ('name', 'click_num', 'market_price', 'add_time')
fields = '__all__'
第二步:
C:\Users\huang\PycharmProjects\MxShop\apps\goods\views.py
from rest_framework import generics, mixins
from rest_framework.pagination import PageNumberPagination
from rest_framework import viewsets
from rest_framework import filters
from django_filters.rest_framework import DjangoFilterBackend
from .serializers import GoodsSerializer, CategorySerializer
from .models import Goods, GoodsCategory
from .filters import GoodsFilter
# Create your views here.
class GoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = "p"
max_page_size = 100
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页 分页 搜索 过滤 排序
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilter
search_fields = ('name', 'goods_brief', 'goods_desc')
ordering_fields = ('sold_num', 'add_time')
class CategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
list:
商品分类列表数据
"""
queryset = GoodsCategory.objects.all()
serializer_class = CategorySerializer
第三步:
C:\Users\huang\PycharmProjects\MxShop\MxShop\urls.py
"""MxShop URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
# from django.contrib import admin
# from django.urls import path
from django.conf.urls import url, include
import xadmin
from MxShop.settings import MEDIA_ROOT
from django.views.static import serve
from rest_framework.documentation import include_docs_urls
from rest_framework.routers import DefaultRouter
from goods.views import GoodsListViewSet, CategoryViewSet
router = DefaultRouter()
# 配置 goods 的url
router.register(r'goods', GoodsListViewSet)
# 配置 category 的url
router.register(r'categorys', CategoryViewSet)
urlpatterns = [
# path('admin/', admin.site.urls),
url(r'^xadmin/', xadmin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
# 商品列表页
# url(r'goods/$', goods_list, name="goods-list"),
url(r'^', include(router.urls)),
url(r'docs/', include_docs_urls(title="木星"))
]
访问:http://127.0.0.1:8000/categorys/
效果:
-----------------------------------------
以上返回的是所有的分类数据
分类真实数据是有三级分类的
-----------------------------------------
之前
GoodsCategory
里面定义的
sub_cat
字段用上了
C:\Users\huang\PycharmProjects\MxShop\apps\goods\serializers.py
from rest_framework import serializers
from goods.models import Goods, GoodsCategory
class CategorySerializer2(serializers.ModelSerializer):
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):
category = CategorySerializer()
class Meta:
model = Goods
# fields = ('name', 'click_num', 'market_price', 'add_time')
fields = '__all__'
现在一级分类里有二级分类
千万不要忘了
many=True
--------------------------
下面完成三级
C:\Users\huang\PycharmProjects\MxShop\apps\goods\serializers.py
from rest_framework import serializers
from goods.models import Goods, GoodsCategory
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):
category = CategorySerializer()
class Meta:
model = Goods
# fields = ('name', 'click_num', 'market_price', 'add_time')
fields = '__all__'
-------------------------------------
目前是获取所有类别及分类
现在要获取某一个分类的详情
http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
只需要加上
mixins.RetrieveModelMixin
C:\Users\huang\PycharmProjects\MxShop\apps\goods\views.py
from rest_framework import generics, mixins
from rest_framework.pagination import PageNumberPagination
from rest_framework import viewsets
from rest_framework import filters
from django_filters.rest_framework import DjangoFilterBackend
from .serializers import GoodsSerializer, CategorySerializer
from .models import Goods, GoodsCategory
from .filters import GoodsFilter
# Create your views here.
class GoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = "p"
max_page_size = 100
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页 分页 搜索 过滤 排序
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilter
search_fields = ('name', 'goods_brief', 'goods_desc')
ordering_fields = ('sold_num', 'add_time')
class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
list:
商品分类列表数据
"""
queryset = GoodsCategory.objects.all()
serializer_class = CategorySerializer
效果:
直接跟上id 即可