热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django里rest_framework的视图组件generics进行优化视图

使用视图组件进行接口优化 使用视图组件的generics进行接口逻辑优化 导入generics from rest_framework import generics 定义序列化类 class

使用视图组件进行接口优化


  1. 使用视图组件的generics进行接口逻辑优化

    1. 导入generics

      from rest_framework import generics

    2. 定义序列化类

      class BookSerializer(serializers.ModelSerializer):class Meta:model = 指定模型类fields = (指定验证字段)extra_kwargs = {"field_name":{"write_only":True}}

    3. 导入序列化类

      from .app_serializers import BookSerializer

    4. 定义视图类

      # 如果你的类只需要get和post方法你继承generics.ListCreateAPIView就可以了
      class BookView(generics.ListCreateAPIView):# queryset和serializer_class是固定的写法# 指定querysetqueryset = BookInfo.objects.all()# 指定序列化类serializer_class = BookSerializer


GET获取全部数据和POST新增一条数据案列


  1. 建立url

    re_path(r"^books/$", BookView.as_view()),

  2. 建立model

    from django.db import modelsfrom datetime import datetime
    # from django.contrib.auth.models import AbstractUserclass AuthorInfo(models.Model):name = models.CharField(max_length=32, verbose_name="作者名称")age = models.IntegerField(verbose_name="作者年龄")class Meta:db_table = "db_author_info"verbose_name = "作者信息"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass PublishInfo(models.Model):name = models.CharField(max_length=32, verbose_name="出版社名称")city = models.CharField(max_length=32, verbose_name="出版社所在城市")email = models.EmailField(verbose_name="出版社邮箱")class Meta:db_table = "db_publish_info"verbose_name = "出版社信息"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass BookInfo(models.Model):title = models.CharField(max_length=32, verbose_name="书名")publishDate = models.DateField(default=datetime.now, verbose_name="出版日期")# max_digits小数位加整数位多少长度 decimal_places小数位长度为2price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="图书价格")publish = models.ForeignKey(PublishInfo, related_name="book", related_query_name="book_query", on_delete=models.CASCADE, verbose_name="出版社")# ManyToManyField多对多authors = models.ManyToManyField(AuthorInfo, verbose_name="图书作者")class Meta:db_table = "db_book_info"verbose_name = "图书信息"verbose_name_plural = verbose_namedef __str__(self):return self.title

  3. 导入generics

    from rest_framework import generics

  4. 定义序列化类

    from.models import BookInfo
    # 第一步: 导入模块
    from rest_framework import serializersclass BookSerializer(serializers.ModelSerializer):class Meta:# 指定 要操作的模型类model = BookInfo# 指定序列化的字段fields = ("title","price","publishDate","publish","authors","author_list","publish_name","publish_city")# 指定那些字段是只写的# write_only只写的 (只写的 前端发送数据时要写它, 后端返回数据时没有它)extra_kwargs = {"publish": {"write_only": True},"authors": {"write_only": True}}# 自定义的字段# read_only只读的 (只读的 前端发送数据时不用写它, 后端返回数据时有它)publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name")publish_city = serializers.CharField(max_length=32, read_only=True, source="publish.city")author_list = serializers.SerializerMethodField()def get_author_list(self, book_obj):# 拿到queryset开始循环 [ {}, {}, {}]authors = []for author in book_obj.authors.all():authors.append(author.name)return authors

  5. 导入序列化类

    from .app_serializers import BookSerializer

  6. 定义视图类

    from rest_framework import genericsfrom .models import BookInfo, PublishInfo, AuthorInfo
    from .app_serializers import BookSerializerclass BookView(generics.ListCreateAPIView):# GenericAPIView会帮我们去找queryset和serializer_class# queryset和serializer_class是固定的写法# 告诉它quertset是谁queryset = BookInfo.objects.all()# 告诉它序列化的类serializer_class = BookSerialize

  7. postman的GET请求所有数据
    在这里插入图片描述

  8. postman的POST请求所有数据
    在这里插入图片描述


使用视图组件进行接口优化


  1. 使用视图组件的generics进行接口逻辑优化

    1. 导入generics

      from rest_framework import generics

    2. 定义序列化类

      class BookSerializer(serializers.ModelSerializer):class Meta:model = 指定模型类fields = (指定验证字段)extra_kwargs = {"field_name":{"write_only":True}}

    3. 导入序列化类

      from .app_serializers import BookSerializer

    4. 定义视图类

      # 如果你的类只需要get和post方法你继承generics.ListCreateAPIView就可以了
      class BookFilterView(generics.RetrieveUpdateDestroyAPIView):# queryset和serializer_class是固定的写法# 指定querysetqueryset = BookInfo.objects.all()# 指定序列化类serializer_class = BookSerializer


GET获取一条数据和PUT修改一条数据和DELETE删除一条数据案列


  1. 建立url

    re_path(r"^books/(?P\d+)/$", BookFilterView.as_view())

  2. 正则不取名叫pk会报一个Expected view BookFilterView to be called with a URL keyword argument named “pk”.的错误
    在这里插入图片描述

  3. 建立model

    from django.db import modelsfrom datetime import datetime
    # from django.contrib.auth.models import AbstractUserclass AuthorInfo(models.Model):name = models.CharField(max_length=32, verbose_name="作者名称")age = models.IntegerField(verbose_name="作者年龄")class Meta:db_table = "db_author_info"verbose_name = "作者信息"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass PublishInfo(models.Model):name = models.CharField(max_length=32, verbose_name="出版社名称")city = models.CharField(max_length=32, verbose_name="出版社所在城市")email = models.EmailField(verbose_name="出版社邮箱")class Meta:db_table = "db_publish_info"verbose_name = "出版社信息"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass BookInfo(models.Model):title = models.CharField(max_length=32, verbose_name="书名")publishDate = models.DateField(default=datetime.now, verbose_name="出版日期")# max_digits小数位加整数位多少长度 decimal_places小数位长度为2price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="图书价格")publish = models.ForeignKey(PublishInfo, related_name="book", related_query_name="book_query", on_delete=models.CASCADE, verbose_name="出版社")# ManyToManyField多对多authors = models.ManyToManyField(AuthorInfo, verbose_name="图书作者")class Meta:db_table = "db_book_info"verbose_name = "图书信息"verbose_name_plural = verbose_namedef __str__(self):return self.title

  4. 导入generics

    from rest_framework import generics

  5. 定义序列化类

    from.models import BookInfo
    # 第一步: 导入模块
    from rest_framework import serializersclass BookSerializer(serializers.ModelSerializer):class Meta:# 指定 要操作的模型类model = BookInfo# 指定序列化的字段fields = ("title","price","publishDate","publish","authors","author_list","publish_name","publish_city")# 指定那些字段是只写的# write_only只写的 (只写的 前端发送数据时要写它, 后端返回数据时没有它)extra_kwargs = {"publish": {"write_only": True},"authors": {"write_only": True}}# 自定义的字段# read_only只读的 (只读的 前端发送数据时不用写它, 后端返回数据时有它)publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name")publish_city = serializers.CharField(max_length=32, read_only=True, source="publish.city")author_list = serializers.SerializerMethodField()def get_author_list(self, book_obj):# 拿到queryset开始循环 [ {}, {}, {}]authors = []for author in book_obj.authors.all():authors.append(author.name)return authors

  6. 导入序列化类

    from .app_serializers import BookSerializer

  7. 定义视图类

    from rest_framework import generics
    from .models import BookInfo, PublishInfo, AuthorInfo
    from .app_serializers import BookSerializer# 需要回去一条数据和删除一条数据和修改一条数据就继承它RetrieveUpdateDestroyAPIView
    class BookFilterView(generics.RetrieveUpdateDestroyAPIView):# GenericAPIView会帮我们去找queryset和serializer_class# queryset和serializer_class是固定的写法# 告诉它quertset是谁queryset = BookInfo.objects.all()# 告诉它序列化的类serializer_class = BookSerializer

8. postman的GET请求获取一条数据![在这里插入图片描述](https://img-blog.csdnimg.cn/20190725194302119.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pzeDEzMTRsb3Zlenlm,size_16,color_FFFFFF,t_70)
9. postman的PUT请求修改一条数据![在这里插入图片描述](https://img-blog.csdnimg.cn/20190725194323649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pzeDEzMTRsb3Zlenlm,size_16,color_FFFFFF,t_70)

  1. postman的DELETE请求删除一条数据
    在这里插入图片描述

推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
真实的独孤一剑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有