url控制器

一、自定义路由(原始方式)

urls.py

url(r'^books/$', views.Books.as_view()),
url(r'^books/(?P<pk>\d+)$', views.BookDetail.as_view()),

 views.py

from rest_framework.views import APIView
from app01 import models
from app01.myser import BookSerializers
from rest_framework.response import Response

class Books(APIView):
    def get(self, request, *args, **kwargs):
        response = {'code': 100, 'msg': '查询成功'}
        ret = models.Book.objects.all()
        book_ser = BookSerializers(instance=ret, many=True)
        response['data'] = book_ser.data
        return Response(response)

    def post(self, request, *args, **kwargs):
        response = {'code': 100, 'msg': '新增成功'}
        book_ser = BookSerializers(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
        else:
            response['code'] = 101
            response['msg'] = book_ser.errors   # 错误信息被response序列化出来返回前端
        return Response(response)

class BookDetail(APIView):
    def get(self, request, pk, **kwargs):  # id是有名分组传过来的id
        response = {'code': 100, 'msg': '查询成功'}
        ret = models.Book.objects.filter(pk=pk).first()
        book_ser = BookSerializers(instance=ret, many=False)
        response['data'] = book_ser.data
        return Response(response)

    def put(self, request, pk, **kwargs):
        response = {'code': 100, 'msg': '修改成功'}
        ret = models.Book.objects.filter(pk=pk).first()
        book_ser = BookSerializers(instance=ret, data=request.data)  # 修改需要传两个参数
        if book_ser.is_valid():
            book_ser.save()  # 校验通过,如果不是空,调update方法, 如果是空,调create方法
                             # 原因是ModelSerializer 重写了这两个方法
        else:
            response['code'] = 101
            response['msg'] = book_ser.errors
        return Response(response)

    def delete(self, request, pk, **kwargs):
        response = {'code': 100, 'msg': '删除成功'}
        models.Book.objects.filter(pk=pk).delete()
        return Response(response)

 

二、第二种方式(视图类继承ModelViewSet)

 urls.py:视图类中只要继承了ViewSetMixin,路由必须这样写

url(r'^publish/$', views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)/$', views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

views.py

from rest_framework.serializers import ModelSerializer
class PublishSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = "__all__"


from rest_framework.viewsets import ModelViewSet
class Publish(ModelViewSet):  # ModelViewSet中继承了ViewSetMixin
    queryset = models.Publish.objects.all()
    serializer_class = PublishSerializers

 

三、第三种方式(自动生成路由)

使用SimpleRouter与DefaultRouter大前提是视图类中必须继承了ModelViewSet

myser.py

from rest_framework.serializers import ModelSerializer
from app01 import models

class PublishSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = '__all__'

views.py

from rest_framework.viewsets import ModelViewSet
from app01 import models
from app01.myser import PublishSerializers

# 自动生成路由
class Publish(ModelViewSet):  # 必须要继承ModelViewSet
    queryset = models.Publish.objects.all()
    serializer_class = PublishSerializers

 

1、SimpleRouter 自动生成两条路由

urls.py

from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
from rest_framework.routers import SimpleRouter

# 自动生成两条路由
router = SimpleRouter()

router.register('publish', views.Publish)
# router.register('book', views.Book)  可以注册很多个

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(router.urls)),
]

前端展示

访问所有图书

 

2、DefaultRouter 自动生成四条路由

urls.py

from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
from rest_framework.routers import DefaultRouter

# 自动生成四条路由
router = DefaultRouter()
router.register('publish', views.Publish)
# router.register('book', views.Book)  可以注册很多个

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(router.urls)),
]

前端展示

 

posted @ 2019-07-05 17:39  TianShu  Views(253)  Comments(0Edit  收藏  举报