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 应用程序的宝贵工具。

相关推荐
wstcl29 分钟前
让你的asp.net网站在调试模式下也能在局域网通过ip访问
后端·tcp/ip·asp.net
冬天给予的预感1 小时前
DAY 54 Inception网络及其思考
网络·python·深度学习
钢铁男儿2 小时前
PyQt5高级界而控件(容器:装载更多的控件QDockWidget)
数据库·python·qt
亿牛云爬虫专家5 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
ai小鬼头8 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶9 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
老任与码9 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5899 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij10 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien10 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt