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

相关推荐
不光头强7 小时前
spring cloud知识总结
后端·spring·spring cloud
花酒锄作田8 小时前
企业微信机器人与 DeepAgents 集成实践
python·mcp·deepagents
GetcharZp10 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多10 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood11 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员11 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai
qq_2837200511 小时前
Python Celery + FastAPI + Vue 全栈异步任务实战
vue.js·python·fastapi
2401_8858850411 小时前
营销推广短信接口集成:结合营销策略实现的API接口动态变量填充方案
前端·python