Django 框架中的 Nestest 序列化器

在 Web 开发领域,创建和使用 API(应用程序编程接口)是很常见的。Django Rest Framework (DRF) 是一个强大的工具包,用于在基于 Django 的 Web 应用程序中构建 API。在 DRF 中,一个关键概念是序列化器。在本文中,我们将深入研究 Django 中嵌套序列化器的概念以及它们如何促进复杂数据关系的处理。

嵌套序列化器的意义

在许多现实场景中,数据模型表现出彼此之间的关系。例如,你可能有一个通过外键与类别模型关联的 Book 模型。在这种情况下,仅仅序列化 Book 对象可能还不够。你可能希望在序列化输出中包含相关的类别信息。这正是嵌套序列化器发挥作用的地方。

设置项目

让我们逐步了解 Django 中嵌套序列化器的实现,以了解它们在实践中的工作原理。考虑这样一个场景,我们有两个模型:类别和书籍,每本书都属于一个类别。我们的目标是序列化 Book 对象及其关联的类别信息。

启动项目

要启动项目,请使用此命令

python 复制代码
django-admin startproject core
cd core

要启动应用程序,请使用此命令

python 复制代码
python manage.py startapp home

现在将此应用程序和 **"rest_framework" **添加到 "settings.py"

python 复制代码
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "home",
    "rest_framework.authtoken",
    
]

文件结构

设置文件

serializer.py :此 Python 代码使用 Django REST 框架创建两个序列化器:CategorySerializerBookSerializer

  • CategorySerializer序列化Category模型,仅包括category_name字段。
  • BookSerializer 序列化 Book 模型的所有字段。它还包括相关类别模型的序列化。
  • 注释掉的行#深度= 1表明能够控制相关模型序列化的深度,但它当前尚未激活。
  • 这些序列化器允许将 Django 模型实例转换为 JSON 数据,以便在 API 响应或请求中使用
python 复制代码
from rest_framework import serializers
from .models import *
from django.contrib.auth.models import User 
class CategorySerializer(serializers.ModelSerializer):
	class Meta:
		model = Category 
		fields = ['category_name',] 
class BookSerializer(serializers.ModelSerializer
	category = CategorySerializer() 
	
	class Meta:
		model = Book 
		fields = '__all__'
		depth =1

models.py:此 Python 代码定义了两个 Django 模型:

  • 类别模型:表示名称为category_name 字段的类别。

  • 书籍型号:

    • 代表一本书,其标题为 book_title 字段。
    • 包括与类别模型的外键关系(类别),将每本书连接到一个类别。
    • 使用 on_delete=models.CASCADE确保删除类别时,其关联的书籍也会被删除。
python 复制代码
from django.db import models

class Category(models.Model):
	category_name = models.CharField(max_length=100)

class Book(models.Model):
	category = models.ForeignKey(Category, on_delete=models.CASCADE)
	book_title = models.CharField(max_length=100)

admin.py:首先我们注册类别,然后注册书籍模型。

python 复制代码
from django.contrib import admin
from .models import *
admin.site.register(Category)
admin.site.register(Book)

views.py :导入各种 Django 和 Django REST 框架模块和类。使用 @api_view 装饰器定义视图函数get_book ,指定它处理 HTTP GET 请求。使用 Book.objects从数据库检索所有 Book 对象。检索到的 Book 对象使用BookSerializer 进行序列化。返回 JSON 响应,状态代码为 200,序列化的图书数据作为负载。

python 复制代码
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import *
from .serializers import *
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token
@api_view(['GET'])
def get_book(request):
	book_objs = Book.objects.all()
	serializer = BookSerializer(book_objs, many=True)
	return Response({'status': 200, 'payload': serializer.data})

core/urls.py:这是我们项目文件夹的 urls.py 文件,在这个 urls.py 文件中,我们首先导入所有重要的库,然后使用 include 函数将应用程序与项目映射。

python 复制代码
from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken import views

urlpatterns = [
	path('', include('home.urls')),
	path("admin/", admin.site.urls),

]

app/urls.py: 在应用程序的 urls.py 文件中,我们导入 admin 并导入路径和 include 方法,并导入views.py 文件的所有功能然后我们创建执行嵌套序列化操作的路径

python 复制代码
from django.contrib import admin
from django.urls import path, include
from .views import *


urlpatterns = [
path('get-book/', get_book),

]

项目部署

运行以下命令来应用迁移:

python 复制代码
python3 manage.py makemigrations
python3 manage.py migrate

借助以下命令运行服务器:

python 复制代码
python3 manage.py runserver

总结

总之,Django 中的嵌套序列化器为处理 API 开发中的复杂数据关系提供了强大的机制。通过将相关模型序列化器合并到主序列化器中,开发人员可以有效地序列化和反序列化数据层次结构,从而提供结构化且信息丰富的 API 响应。无论是处理父子关系、深度依赖关系还是多级数据结构,嵌套序列化程序都增强了 Django 支持的 API 的灵活性和可用性,使其成为创建丰富且高效的 Web 应用程序的宝贵工具。

相关推荐
魔道不误砍柴功1 小时前
Java中的Stream API:从入门到实战
java·windows·python
xinghuitunan1 小时前
时间转换(acwing)c/c++/java/python
java·c语言·c++·python
tekin2 小时前
Python 高级数据结构操作全解析:从理论到实践
数据结构·python·集合set·高级数据结构·集合操作·队列操作·堆操作
多敲代码防脱发2 小时前
Spring框架基本使用(Maven详解)
java·网络·后端·spring·maven
关关钧2 小时前
【R语言】绘图
开发语言·python·r语言
Asthenia04122 小时前
Mybatis实践——Wrapper&&三表联查&&BaseMapper和Service的功能分异
后端
m0_748248022 小时前
爬虫自动化(DrissionPage)
爬虫·python·自动化
B站计算机毕业设计超人3 小时前
计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
java·vue.js·spring boot·后端·spring·intellij-idea·课程设计
量化投资技术3 小时前
【量化科普】Arbitrage,套利
python·量化交易·量化·量化投资·qmt·miniqmt
量化投资技术3 小时前
【量化科普】Liquidity,流动性
python·量化交易·量化·量化投资·qmt·miniqmt