基于Django drf框架序列化视图

 更新时间:2023年06月22日 10:22:41   作者:子午  
这篇文章主要为大家介绍了基于Django drf框架序列化视图,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

介绍

drf框架是基于Django框架,用于快速构建Web RESTful API的工具

官方文档:https://www.django-rest-framework.org/

安装:pip install djangorestframework

快速使用

1. 搭建模型

from django.db import models
class BookModel(models.Model):
    """
    书籍模型
    """
    name = models.CharField(max_length=200, verbose_name='书籍名称')
    book_info = models.TextField(max_length=1024, default=None, blank=True, verbose_name='书籍介绍')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    class Meta:
        db_table = 'tb_book'
        verbose_name = '书籍信息'
        verbose_name_plural = verbose_name
class HeroModel(models.Model):
    """
    书籍人物模型
    """
    name = models.CharField(max_length=200, verbose_name='英雄姓名')
    hero_info = models.TextField(max_length=1024, default=None, blank=True, verbose_name='英雄介绍')
    join_time = models.DateTimeField(auto_now_add=True, verbose_name='加入时间')
    book_name = models.ForeignKey('BookModel', on_delete=models.CASCADE, related_name='book_hero', verbose_name='所属书籍')
    class Meta:
        db_table = 'tb_hero'
        verbose_name = '书籍人物信息'
        verbose_name_plural = verbose_name
  • 注意外键对应关系

2. setting配置

INSTALLED_APPS = [
    ......
    'rest_framework',
]

3. 序列化器serializer

# serializers.py
from rest_framework import serializers
from .models import BookModel, HeroModel
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookModel
        fields = '__all__'

4. 视图views

# views.py
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from .serializers import BookSerializer
from .models import BookModel
class Books(GenericViewSet, ListModelMixin, CreateModelMixin):
    queryset = BookModel.objects.all()
    serializer_class = BookSerializer

5. 路由自动注册DefaultRouter

from rest_framework.routers import DefaultRouter
from . import views
app_name = 'book'
urlpatterns = [
]
router = DefaultRouter()
router.register('book', views.Books, basename='book')
urlpatterns += router.urls

6. 效果显示

序列化关联返回serializers

1. 返回关联外键的ID:PrimaryKeyRelatedField

class BookSerializer(serializers.ModelSerializer):
    book_hero = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
    class Meta:
        model = BookModel
        fields = ['name', 'book_info', 'book_hero', 'create_time']

2. 返回关联字段模型的__str__方法的值

StringRelatedField

class BookSerializer(serializers.ModelSerializer):
    book_hero = serializers.StringRelatedField(read_only=True, many=True)
    class Meta:
        model = BookModel
        fields = ['name', 'book_info', 'book_hero', 'create_time']

3. 嵌套序列化器的使用

class BookSerializer(serializers.ModelSerializer):
    # Heroserializer应先于本序列化器前定义
    book_hero = HeroSerializer(many=True)
    class Meta:
        model = BookModel
        fields = ['name', 'book_info', 'book_hero', 'create_time']

4. read_only和write_only

  • read_only=True不参与反序列化验证过程,只参与序列化返回过程
  • write_only: 不参与序列化返回过程,只参与验证过程

5. 自定义验证方法(单/多字段验证)

单一字段验证

class BookSerializer(serializers.ModelSerializer):
    book_hero = serializers.StringRelatedField(many=True, read_only=True)
    class Meta:
        model = BookModel
        fields = ['name', 'book_info', 'book_hero', 'create_time']
    def validate_name(self, value):
        """
        验证书名不能是python
        """
        if value == 'python':
            raise serializers.ValidationError('书名不能是python')
        return value

多字段验证

def validate(self, attrs):
        if attrs['name'] == 'python' or attrs['book_info'] == 'python':
            raise serializers.ValidationError('书名或info不能是python')
        return attrs

6. self.action自定义装饰器使用

from rest_framework.decorators import action
class Books(GenericViewSet, ListModelMixin, CreateModelMixin):
    queryset = BookModel.objects.all()
    serializer_class = BookSerializer
    @action(methods=['get'], detail=True)
    def hello(self, request, pk):
        res = 'hello' + str(pk)
        return Response(res)

http://127.0.0.1:8000/book/1/hello/

以上就是基于Django drf框架序列化视图的详细内容,更多关于Django drf框架序列化 视图的资料请关注脚本之家其它相关文章!

相关文章

  • Python 绘制桑基图全面解析

    Python 绘制桑基图全面解析

    桑基图,即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。试了一下用python画桑基图,在这里整理了一下分享给大家
    2021-09-09
  • Python实战之使用PyQt5构建HTTP接口测试工具

    Python实战之使用PyQt5构建HTTP接口测试工具

    在现代软件开发中,测试接口的有效性与响应情况变得尤为重要,本文将指导构建一个简单的HTTP接口测试工具,使用Python的PyQt5库创建用户界面,并通过requests库发送 HTTP 请求,需要的可以参考下
    2024-11-11
  • 简单学习Python多进程Multiprocessing

    简单学习Python多进程Multiprocessing

    这篇文章主要和大家一起简单的学习Python多进程Multiprocessing ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • python内存泄漏排查技巧总结

    python内存泄漏排查技巧总结

    这篇文章主要给大家分享了python内存泄漏排查技巧总结,工作过程中服务难免遇到内存泄漏问题,下面文章就给大家总结一些排查下技巧,具有一定的参考价值,需要的朋友可以参考一下
    2021-12-12
  • python进程类subprocess的一些操作方法例子

    python进程类subprocess的一些操作方法例子

    这篇文章主要介绍了python进程类subprocess的一些操作方法例子,本文讲解了Popen、wait、poll、kill、communicate等方法的实际操作例子,需要的朋友可以参考下
    2014-11-11
  • Python使用Selenium自动进行百度搜索的实现

    Python使用Selenium自动进行百度搜索的实现

    我们今天介绍一个非常适合新手的python自动化小项目,这个例子非常适合新手学习Python网络自动化,不仅能够了解如何使用Selenium,而且还能知道一些超级好用的小工具。感兴趣的可以了解一下
    2021-07-07
  • 15个Python运行速度优化技巧分享

    15个Python运行速度优化技巧分享

    这篇文章主要为大家详细介绍了15个Python运行速度优化技巧,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2025-02-02
  • Python排序算法之插入排序及其优化方案详解

    Python排序算法之插入排序及其优化方案详解

    今天给大家带来的文章是关于Python的相关知识,文章围绕着Python插入排序及其优化方案展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Matplotlib快速入门指南(适合小白)

    Matplotlib快速入门指南(适合小白)

    这篇文章主要给大家介绍了关于Matplotlib快速入门指南的相关资料,Matplotlib是一个非常强大的Python画图工具,支持跨平台运行,它不仅是Python常用的2D绘图库,同时它也提供了一部分3D绘图接口,需要的朋友可以参考下
    2023-09-09
  • 20行Python代码实现一款永久免费PDF编辑工具的实现

    20行Python代码实现一款永久免费PDF编辑工具的实现

    这篇文章主要介绍了20行Python代码实现一款永久免费PDF编辑工具的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论