【Django】REST 常用类

ModelSerializer

serializers.ModelSerializer 是 Django REST framework(DRF)里的一个强大工具,它能极大简化序列化和反序列化 Django 模型实例的流程。下面从多个方面详细介绍它:

1. 基本概念

序列化是把 Django 模型实例转化为 Python 原生数据类型(像字典、列表等),进而能方便地转换为 JSON、XML 等格式用于传输;反序列化则是将接收到的数据转换回 Django 模型实例。ModelSerializer 会自动依据模型的字段定义来生成序列化器的字段,减少了手动编写序列化器字段的工作量。

2. 基本用法

假设你有一个简单的 Django 模型 Book

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)published_date = models.DateField()def __str__(self):return self.title

可以创建一个对应的 ModelSerializer

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'published_date']

在上述代码里,Meta 类的 model 属性指定要序列化的模型,fields 属性指定要包含在序列化结果中的字段。

3. 常用属性和方法

Meta 类属性
  • model:指定要序列化的 Django 模型。
  • fields:指定要包含在序列化结果中的字段,可以是字段名的列表或字符串 '__all__'(表示包含模型的所有字段)。
  • exclude:指定要排除的字段,不能与 fields 同时使用。
  • read_only_fields:指定只读字段,这些字段在反序列化时会被忽略。
  • extra_kwargs:用于为特定字段提供额外的参数,例如设置字段的 requiredwrite_only 等属性。

示例:

class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'read_only_fields = ['id']extra_kwargs = {'title': {'required': True},'author': {'write_only': True}}
序列化方法
  • data:返回序列化后的 Python 原生数据类型。
book = Book.objects.first()
serializer = BookSerializer(book)
print(serializer.data)
  • is_valid():验证反序列化的数据是否有效。
data = {'title': 'New Book', 'author': 'John Doe', 'published_date': '2023-01-01'}
serializer = BookSerializer(data=data)
if serializer.is_valid():book = serializer.save()
else:print(serializer.errors)
  • save():保存反序列化后的数据,创建或更新模型实例。

4. 自定义序列化行为

可以通过重写序列化器的方法来自定义序列化和反序列化行为。

重写 to_representation 方法
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'def to_representation(self, instance):data = super().to_representation(instance)data['title'] = data['title'].upper()return data
重写 createupdate 方法
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'def create(self, validated_data):# 自定义创建逻辑return Book.objects.create(**validated_data)def update(self, instance, validated_data):# 自定义更新逻辑instance.title = validated_data.get('title', instance.title)instance.author = validated_data.get('author', instance.author)instance.published_date = validated_data.get('published_date', instance.published_date)instance.save()return instance

5. 优点

  • 代码简洁:自动生成序列化器字段,减少了手动编写的工作量。
  • 一致性:序列化器的字段与模型的字段保持一致,方便维护。
  • 验证功能:自动提供基本的验证功能,确保数据的有效性。

总之,serializers.ModelSerializer 是 Django REST framework 中非常实用的工具,能让你更高效地处理 Django 模型的序列化和反序列化。


在 Django REST framework(DRF)里,ModelSerializer 中的 update 方法主要用于处理更新现有模型实例的逻辑。当你使用序列化器来更新一个已存在的模型对象时,update 方法会被调用。下面为你详细介绍它的作用、工作机制以及使用示例。

作用

update 方法的核心作用是接收经过验证的数据,把这些数据应用到已有的模型实例上,并且保存更新后的实例。它是序列化器在处理 PUT 或者 PATCH 请求时的关键部分,能够帮助你定制模型实例更新的具体逻辑。

工作机制

  • 当你调用序列化器的 save 方法并且传入一个已存在的模型实例时,序列化器会自动调用 update 方法。
  • update 方法接收两个参数:
    • instance:代表要更新的模型实例。
    • validated_data:是一个字典,包含经过验证的要更新的数据。
  • update 方法内部,你可以从 validated_data 里提取数据,把这些数据赋给 instance 的相应字段,然后调用 instance.save() 方法保存更新后的实例。

示例代码

下面是一个简单的示例,展示了如何在 ModelSerializer 中重写 update 方法:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'published_date']def update(self, instance, validated_data):# 更新实例的字段instance.title = validated_data.get('title', instance.title)instance.author = validated_data.get('author', instance.author)instance.published_date = validated_data.get('published_date', instance.published_date)# 保存更新后的实例instance.save()return instance

代码解释

  • instance.title = validated_data.get('title', instance.title):这行代码尝试从 validated_data 中获取 title 字段的值,如果 validated_data 中存在 title 字段,就将其赋值给 instance.title;如果不存在,就保持 instance.title 的原有值。
  • instance.save():调用 save 方法将更新后的实例保存到数据库中。
  • return instance:返回更新后的实例。

自定义更新逻辑

你可以在 update 方法中添加自定义的更新逻辑,例如在更新某些字段时执行额外的操作,或者根据特定条件更新不同的字段。

def update(self, instance, validated_data):if 'title' in validated_data:# 在更新标题时执行额外的操作new_title = validated_data['title'].upper()instance.title = new_titleif 'author' in validated_data:# 检查作者是否合法if len(validated_data['author']) > 5:instance.author = validated_data['author']instance.published_date = validated_data.get('published_date', instance.published_date)instance.save()return instance

在这个例子中,当更新 title 字段时,会将新标题转换为大写;更新 author 字段时,会检查作者名字的长度是否大于 5。

综上所述,update 方法为你提供了一种灵活的方式来定制模型实例的更新逻辑,以满足特定的业务需求。


ForeignKey

在 Django 中,models.ForeignKey 是一个非常重要的字段类型,用于在模型之间创建多对一(Many-to-One)的关联关系。下面将从多个方面对其进行详细介绍。

1. 基本概念

多对一关系表示一个模型的多个实例可以关联到另一个模型的一个实例。例如,在一个博客应用中,多篇文章(Article)可以属于同一个作者(Author),那么文章和作者之间就是多对一的关系。models.ForeignKey 就是用来在 Django 模型中定义这种关系的。

2. 基本语法

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Article(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE)def __str__(self):return self.title

在上述代码中,Article 模型中的 author 字段是一个 ForeignKey,它指向 Author 模型。这意味着每篇文章都关联到一个作者。

3. 参数说明

to
  • 作用:指定关联的模型。可以是模型类本身,也可以是模型类的字符串表示(如 'app_label.ModelName')。
  • 示例
author = models.ForeignKey('myapp.Author', on_delete=models.CASCADE)
on_delete
  • 作用:定义当关联的对象被删除时,当前对象应该如何处理。这是一个必需的参数。
  • 常见选项
    • models.CASCADE:级联删除。当关联的对象被删除时,与之关联的所有对象也会被删除。例如,当一个作者被删除时,他所写的所有文章都会被删除。
    • models.PROTECT:保护模式。如果有关联的对象存在,不允许删除关联的对象,会抛出 ProtectedError 异常。
    • models.SET_NULL:将关联字段设置为 NULL。前提是该字段必须允许为空(null=True)。例如,当一个作者被删除时,他所写的文章的 author 字段会被设置为 NULL
    • models.SET_DEFAULT:将关联字段设置为默认值。前提是该字段必须有默认值(default=...)。
    • models.SET():将关联字段设置为指定的值或调用指定的函数返回的值。
    • models.DO_NOTHING:不做任何处理。可能会导致数据库中的外键约束错误。
related_name
  • 作用:定义从关联模型反向查询时使用的名称。默认情况下,Django 会自动生成一个反向查询的名称,格式为 modelname_set(例如,article_set)。使用 related_name 可以自定义这个名称。
  • 示例
class Article(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')

现在可以通过 author.articles.all() 来获取该作者的所有文章。

null
  • 作用:指定该字段是否可以为空。如果设置为 True,则允许该字段在数据库中存储 NULL 值。
  • 示例
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
blank
  • 作用:指定在表单验证时该字段是否可以为空。如果设置为 True,则在表单中该字段可以不填写。
  • 示例
author = models.ForeignKey(Author, on_delete=models.CASCADE, blank=True)

4. 反向查询

通过 ForeignKey 建立的关联关系,可以进行反向查询。例如,有了上述的 ArticleAuthor 模型,可以这样进行反向查询:

author = Author.objects.get(name='John Doe')
articles = author.article_set.all()  # 如果没有指定 related_name
# 或者
articles = author.articles.all()  # 如果指定了 related_name='articles'

5. 数据库层面

在数据库中,ForeignKey 字段会被存储为一个整数,这个整数是关联模型实例的主键值。例如,Article 表中的 author 字段会存储对应的 Author 实例的 id

6. 注意事项

  • 当使用 ForeignKey 时,要确保 on_delete 参数设置合理,避免出现数据不一致的问题。
  • 频繁的级联删除可能会导致数据丢失,使用时要谨慎。

综上所述,models.ForeignKey 是 Django 中实现多对一关系的重要工具,通过合理使用其参数,可以灵活地管理模型之间的关联。


ModelViewSet

在 Django REST framework(DRF)里,viewsets.ModelViewSet 是一个强大且实用的工具,它简化了基于 Django 模型构建 RESTful API 的过程。下面我会详细讲解 viewsets.ModelViewSet 及其相关的 viewsets 模块。

1. viewsets 模块概述

viewsets 模块是 Django REST framework 提供的一组视图集类,它们把不同的视图逻辑(如列表视图、详情视图、创建视图、更新视图、删除视图等)组合在一起,让你能够以一种更简洁、高效的方式构建 API。视图集可以根据不同的 HTTP 请求方法(如 GETPOSTPUTDELETE 等)自动处理对应的操作。

2. ModelViewSet 简介

ModelViewSetviewsets 模块中的一个核心类,它继承自多个不同的混合类(如 CreateModelMixinRetrieveModelMixinUpdateModelMixinDestroyModelMixinListModelMixin),这些混合类为 ModelViewSet 提供了完整的 CRUD(创建、读取、更新、删除)操作功能。

3. 基本用法

假设你有一个简单的 Django 模型 Book

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)published_date = models.DateField()def __str__(self):return self.title

你可以创建一个对应的 ModelViewSet 来处理这个模型的 API 操作:

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer

这里的 BookSerializer 是一个序列化器,用于将 Book 模型实例序列化为 JSON 数据,以及将 JSON 数据反序列化为 Book 模型实例。以下是一个简单的序列化器示例:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'published_date']

4. 路由配置

为了让 BookViewSet 能够响应 HTTP 请求,需要进行路由配置。Django REST framework 提供了 routers 模块来简化路由配置:

from rest_framework import routers
from .views import BookViewSetrouter = routers.DefaultRouter()
router.register(r'books', BookViewSet)urlpatterns = router.urls

这样,BookViewSet 就会自动处理以下几种类型的请求:

  • GET /books/:获取所有书籍的列表。
  • POST /books/:创建一本新的书籍。
  • GET /books/{id}/:获取指定 ID 的书籍详情。
  • PUT /books/{id}/:更新指定 ID 的书籍的所有字段。
  • PATCH /books/{id}/:部分更新指定 ID 的书籍的字段。
  • DELETE /books/{id}/:删除指定 ID 的书籍。

5. 方法和属性

  • queryset:指定要处理的模型实例集合,通常是一个查询集(QuerySet)。
  • serializer_class:指定用于序列化和反序列化的序列化器类。
  • get_queryset():可以重写这个方法来动态地返回不同的查询集,例如根据用户权限过滤数据。
class BookViewSet(viewsets.ModelViewSet):serializer_class = BookSerializerdef get_queryset(self):# 只返回已发布的书籍return Book.objects.filter(published=True)
  • perform_create():可以重写这个方法来在创建新实例时执行额外的操作,例如记录日志。
class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializerdef perform_create(self, serializer):# 在创建书籍时记录日志print(f"Creating a new book: {serializer.validated_data['title']}")serializer.save()

6. 优点

  • 代码简洁:通过继承 ModelViewSet,可以用很少的代码实现完整的 CRUD 操作,减少了重复代码。
  • 可维护性高:将不同的视图逻辑封装在一个类中,使得代码结构更加清晰,易于维护和扩展。
  • 自动生成路由:结合 routers 模块,可以自动生成 API 的路由,简化了路由配置。

综上所述,viewsets.ModelViewSet 是 Django REST framework 中一个非常实用的工具,能够帮助你快速、高效地构建功能完整的 RESTful API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GuassDB如何创建兼容MySQL语法的数据库

GaussDB简介 GaussDB是由华为推出的一款全面支持OLTP和OLAP的分布式关系型数据库管理系统。它采用了分布式架构和高可靠性设计,可以满足大规模数据存储和处理的需求。GaussDB具有高性能、高可靠性和可扩展性等特点,适用于各种复杂的业务场景&#xff0c…

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义:SOCKET - IO复用技术是一种高效处理多个套接字(socket)的手段,能让单个线程同时监听多个文件描述符(如套接字)上的I/O事件(像可读、可写、异常)&#x…

spring中的@Qualifier注解详解

1. 核心作用 Qualifier是Spring框架中用于解决依赖注入歧义性的关键注解。当容器中存在多个相同类型的Bean时,Autowired默认按类型自动装配会抛出NoUniqueBeanDefinitionException异常,此时通过Qualifier指定Bean的唯一标识符(名称或自定义限…

Python爬虫实战:获取文学网站四大名著并保存到本地

一、引言 1.1 研究背景 中国古典四大名著承载着深厚的文化底蕴,是中华民族的宝贵精神财富。在互联网时代,网络文学资源虽丰富多样,但存在分散、质量参差不齐等问题 。部分文学网站存在访问限制、资源缺失等情况,用户难以便捷获取完整、高质量的经典著作内容。开发专业的爬…

【一】浏览器的copy as fetch和copy as bash的区别

浏览器的copy as fetch和copy as bash的区别 位置:devTools->network->请求列表右键 copy as fetch fetch("https://www.kuaishou.com/graphql", {"headers": {"accept": "*/*","accept-language": &qu…

渠道销售简历模板范文

模板信息 简历范文名称:渠道销售简历模板范文,所属行业:其他 | 职位,模板编号:KRZ3J3 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…

Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合

随着城市化进程加速,空气质量监测与污染溯源成为智慧城市建设的核心议题。传统监测手段受限于数据离散性、分析滞后性及可视化能力不足,难以支撑实时决策。2025年4月27日发布的《Java大数据可视化在城市空气质量监测与污染溯源中的应用》一文&#xff0c…

《面向对象程序设计-C++》实验五 虚函数的使用及抽象类

程序片段编程题 1.【问题描述】 基类shape类是一个表示形状的抽象类&#xff0c;area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类&#xff08;circles&#xff09;、并给出具体的求面积函数。注&#xff1a;圆周率取3.14 #include<iostream> #in…

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充&#xff1a;什么是中序线索化 中序遍历是什么 一、代码解释 1.结构体定义 Node 结构体&#xff1a; 成员说明&#xff1a; int data&#xff1a;存储节点的数据值。 struct Node* lchild&#xff1a;该节点的左孩子 struct Node* rchild&#xff1a;该节点的右孩子…

高拟人化客服机器人显著提升用户接受度

高拟人化客服机器人显著提升用户接受度 目录 高拟人化客服机器人显著提升用户接受度思维导图详细总结一、研究背景与目的二、理论基础与变量设计三、研究方法与实验设计四、核心结论与策略建议五、研究局限与未来方向关键问题与答案高拟人化客服机器人显著提升用户接受度,且与…

202534 | KafKa简介+应用场景+集群搭建+快速入门

Apache Kafka 简介 一、什么是 Kafka&#xff1f; Apache Kafka 是一个高吞吐量、分布式、可扩展的流处理平台&#xff0c;用于构建实时数据管道和流应用程序。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源&#xff0c;目前由 Apache 软件基金会进行维护。 Kafka 具备…

Blender 初学者指南 以及模型格式怎么下载

glbxz.com glbxz.com 可以直接下载Blender格式模型 第 1 步&#xff1a;打开 这就是 blender 打开时的样子。 您面对的是左侧和右侧的工具栏&#xff0c;顶部是文件作&#xff0c;底部是时间轴&#xff0c;中间是 3D 视图。 Blender 的默认起始网格是一个立方体&#xff0c…

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

RV1126 ROS2环境交叉编译及部署(基于官方Docker) 0 前言1 SDK源码更新1.1 启动Docker容器1.2 更新SDK源码1.3 SDK更新问题2 ROS2编译配置3 Buildroot rootfs编译ROS2的依赖包3.1 编译问题解决4 使用Docker交叉编译ROS24.1 准备Linux(Ubuntu) PC机的依赖环境4.1.1 Ubuntu PC机…

Go 面向对象,封装、继承、多态

Go 面向对象&#xff0c;封装、继承、多态 经典OO&#xff08;Object-oriented 面向对象&#xff09;的三大特性是封装、继承与多态&#xff0c;这里我们看看Go中是如何对应的。 1. 封装 封装就是把数据以及操作数据的方法“打包”到一个抽象数据类型中&#xff0c;这个类型…

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么&#xff1f;有什么区别&#xff1f; 一. 什么是AP&#xff1f;二. 什么是AC&#xff1f;三. AP与AC的关系 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都…

Android SDK

Windows纯净卸载Android SDK 1.关闭所有安卓相关的程序 Android StudioEmulators 如模拟器Command prompts using SDK 如appium服务 2.移除SDK相关目录 # Delete your SDK directory F:\android_sdk\android-sdk-windows# Also check and remove if present: $env:LOCALAPP…

Android耗电优化全解析:从原理到实践的深度治理指南

引言 在移动应用性能优化体系中&#xff0c;耗电优化是用户体验的核心指标之一。据Google官方统计&#xff0c;超过60%的用户会因为应用耗电过快而选择卸载应用。本文将从耗电统计原理、监控手段、治理策略三个维度展开&#xff0c;结合Android系统源码与实际代码示例&#xf…

QMK自定义4*4键盘固件创建教程:最新架构详解

QMK自定义4*4键盘固件创建教程&#xff1a;最新架构详解 前言 通过本教程&#xff0c;你将学习如何在QMK框架下创建自己的键盘固件。QMK是一个强大的开源键盘固件框架&#xff0c;广泛用于DIY机械键盘的制作。本文将详细介绍最新架构下所需创建的文件及其功能。 准备工作 在…

DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业的核心资产。然而&#xff0c;数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA&#xff08;数据管理协会&#xff09;提出的参考数据&#xff08;Reference Data&#xff09;与主数据&#xff08;Master Data&…

力扣题解:2、两数相加

个人认为&#xff0c;该题目可以看作合并两个链表的变种题&#xff0c;本题与21题不同的是&#xff0c;再处理两个结点时&#xff0c;对比的不是两者的大小&#xff0c;而是两者和是否大于10&#xff0c;加法计算中大于10要进位&#xff0c;所以我们需要声明一个用来标记是否进…