###############   三种视图    ###############

# 第一种方法:使用mixins
# class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
# # GenericAPIView这个继承了APIview,
# # 必须要继承这三个类,
# queryset=Author.objects.all()
# serializer_class = AuthorModelSerializers
#
# def get(self, request, *args, **kwargs):
# return self.list(request, *args, **kwargs)
#
# def post(self, request, *args, **kwargs):
# return self.create(request, *args, **kwargs)
#
#
# class AuthorDetailView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
# # RetrieveModelMixin,这是查看单条数据
# queryset=Author.objects.all()
# serializer_class = AuthorModelSerializers
#
# def get(self, request, *args, **kwargs):
# return self.retrieve(request, *args, **kwargs)
#
# def delete(self, request, *args, **kwargs):
# return self.destroy(request, *args, **kwargs)
#
# def put(self, request, *args, **kwargs):
# return self.update(request, *args, **kwargs) # 第二种方法
# 经过这么封装之后,下面你只需要改表名就可以了,就更加的方便了,
# class AuthorView(generics.ListCreateAPIView,generics.GenericAPIView):
# # ListCreateAPIView,一个顶两个,又封装了一层,
# queryset=Author.objects.all()
# serializer_class = AuthorModelSerializers
#
#
# class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView,generics.GenericAPIView):
# # RetrieveUpdateDestroyAPIView,一个顶三个,
# queryset=Author.objects.all()
# serializer_class = AuthorModelSerializers # 第三种方法
# 这种方法就要动到URL了,
# 这种方式不够灵活,如果你想要丰富一个方法,可以重写某一个方法,比如def list()
class AuthorModelView(viewsets.ModelViewSet):
# permission_classes = [SVIPPermission]
# throttle_classes = [VisitRateThrottle]
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
pagination_class = MyPageNumberPagination

###############   对应的路由配置    ###############

from django.conf.urls import url,include
from django.contrib import admin from rest_framework import routers from app01.views import views # 但是现在有一个问题,以后是不是只要多一个表,就需要两个url了?
# 这样有十张表就要写十次了,所以你封装了视图类了,你也需要封装一下路由,
# 怎么封装?
from rest_framework import routers
routers=routers.DefaultRouter()
routers.register("authors",views.AuthorModelView)
# 再有一张表,就只需要注册就可以了,
routers.register("books",views.BookModelView) urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publishes/$', views.PublishView.as_view(),name="publish"), # View:view(request)=====APIView:dispatch()
url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), # View:view(request)=====APIView:dispatch()
# url(r'^books/$', views.BookView.as_view(),name="books"),
# url(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"),
# 下面两行,自己写视图,第一种视图,第二种视图都是可以适用的,
# url(r'^authors/$', views.AuthorView.as_view(), name="author"),
# url(r'^authors/(?P<pk>\d+)/$', views.AuthorDetailView.as_view(), name="detailauthor"),
# 下面两行url的配置用来配合第三种视图模式:传递字典参数的写法内部使用到了反射,
# url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}), name="author"),
# url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}), name="detailauthor"),
# 下面一行路由配置,配合第三种视图,更加的简洁
url(r'',include(routers.urls)),
url(r'^login/$', views.LoginModelView.as_view(), name="login"),
url(r'^app01/(?P<version>\w+)/', include('app01.urls')),
]

###############   对应的序列化类    ###############

from rest_framework import serializers
from app01.models import *
# 为queryset,model对象做序列化 class PublishSerializers(serializers.Serializer):
name = serializers.CharField()
email = serializers.CharField() class PublishModelSerializers(serializers.ModelSerializer):
class Meta:
model=Publish
fields="__all__" class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
pub_date = serializers.DateField()
publish=serializers.CharField(source="publish.name") # 这是一对多的字段,需要特殊处理,就使用source就可以了
#authors=serializers.CharField(source="authors.all") # 这是多对多的字段,需要特殊处理,但是展示的样式不好,
authors = serializers.SerializerMethodField() # 这是多对多字段更好的实现方法,一定要实现一个对应的方法,格式就是get_字段的名字,
def get_authors(self,obj):
temp=[]
for obj in obj.authors.all():
temp.append(obj.name)
return temp '''
序列化BookSerializers(book_list,many=True)过程:
temp=[]
for obj in book_list:
temp.append({
"title":obj.title,
"price":obj.price,
"pub_date":obj.pub_date,
"publish":str(obj.publish), # obj.publish.name
#"authors":obj.authors.all,
"authors": get_authors(obj)
}) ''' class BookModelSerializers(serializers.ModelSerializer): # 这个Serializer就类似form,这个ModelSerializer就类似于modelform,
class Meta:
model = Book
fields = "__all__" # 这里面实现了一对多和多对多,一对多是展示的id,多对多是展示的一个id列表, #publish=serializers.CharField(source="publish.pk") # 如果你不写单个的字段就是用ModelSerializer的,如果你自己写了就用你自己的,
# publish=serializers.HyperlinkedIdentityField( # 超链接
# view_name="detailpublish", #detailpublish 这是publisher的链接,detailpublish这是路由的地方写的别名,链接地址,
# lookup_field="publish_id",
# lookup_url_kwarg="pk"
# ) # authors=serializers.CharField(source="authors.all")
# authors = serializers.SerializerMethodField()
# def get_authors(self,obj):
# temp=[]
# for obj in obj.authors.all():
# temp.append(obj.name)
# return temp # def create(self, validated_data): # 如果你自定义了一对多的字段,是不支持source写法的,你需要重写create方法,
# print("validated_data",validated_data)
# book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
# book.authors.add(*validated_data["authors"]) # 这种写法你要记住,
#
# return book class AuthorModelSerializers(serializers.ModelSerializer):
class Meta:
model=Author
fields="__all__"

###############   总结   ###############

总结一下,也没有多少东西
1,三种视图的使用
2,第三种视图需要配合url 的配置,
3,但是一般还是自己写视图,不使用这三种视图,因为不够灵活,

###############   总结   ###############

###############   总结   ###############

rest framework-视图和路由-长期维护的更多相关文章

  1. Django Rest Framework 视图和路由

    Django Rest Framework 视图和路由   DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...

  2. rest framework 视图,路由

    视图 在上面序列化的组件种已经用到了视图组件,即在视图函数部分进行逻辑操作. 但是很明显的弊端是,对每个表的增删改查加上 单条数据,需要用到 2个类 5个方法(增删改查,单数据查)才可以完整的实现,当 ...

  3. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  4. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  5. Django REST framework基础:视图和路由

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...

  6. Django REST framework 之分页,视图,路由,渲染器

    1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...

  7. python 全栈开发,Day96(Django REST framework 视图,django logging配置,django-debug-toolbar使用指南)

    昨日内容回顾 1. Serializer(序列化) 1. ORM对应的query_set和ORM对象转换成JSON格式的数据 1. 在序列化类中定义自定义的字段:SerializerMethodFie ...

  8. Django-Rest-Framework的视图和路由

    Django-Rest-Framework的视图和路由  restful framework  Django-Rest-Framework的视图 APIView django中写CBV的时候继承的是V ...

  9. Rest_Framework的视图与路由

    视图与路由 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django ...

随机推荐

  1. HTML5 之 简单汇总

    参考: HTML5的十大新特性 前端面试必备之html5的新特性 HTML5 1.语义化元素 1.1结构元素 标签 描述 article 表示与上下文不相关的独立内容区域 aside 定义页面的侧边栏 ...

  2. 干货 | 把Flutter扩展到微信小程序端的探索

    Google Flutter是一个非常优秀的跨端框架,不仅可以运行在Android. iOS平台,而且可以支持Web和桌面应用.在国内小程序是非常重要的技术平台,我们也一直思考能否把Flutter扩展 ...

  3. Vmware 困惑点记录和解释

    个人理解,如果有不同见解,麻烦请留言,一起进行探讨: DRS和HA是两个独立的功能. 准入控制只是保障有资源打开故障后迁移来的虚拟机,就算自身已经超过切换的阈值了,HA也是可以迁移过去的. 虚拟机允许 ...

  4. Thread--生产者消费者假死分析

    package p_c_allWait; public class ValueObject { public static String value = ""; } package ...

  5. PowerDesigner 表格导出为excel(转载)

    选中tablesctrl + shift +x 然后运行脚本 '******************************************************************** ...

  6. POJ 2976 Dropping tests【0/1分数规划模板】

    传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...

  7. MyBatis从入门到精通(第6章):6.3 使用枚举或其他对象

    6.3 使用枚举或其他对象 在 sys_role 表中存在一个字段 enabled,这个字段只有两个可选值,0 为禁用,1 为启用.但是在 SysRole 类中,我们使用的是 Integer enab ...

  8. py02_02:pyc的解释

    1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...

  9. nodejs服务后台持续运行三种方法

    一.利用 forever forever是一个nodejs守护进程,完全由命令行操控.forever会监控nodejs服务,并在服务挂掉后进行重启. 1.安装 forever npm install ...

  10. Python 学习笔记:根据输入年月获取该月的第一天和最后一天

    目的: 给定一个时间,比如:2020.02,要求返回所输入月份的第一天及最后一天,比如:('2020.02.01', '2020.02.29') 参考博客:https://blog.csdn.net/ ...