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

相关推荐
leobertlan5 小时前
2025年终总结
前端·后端·程序员
面向Google编程5 小时前
从零学习Kafka:数据存储
后端·kafka
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
易安说AI6 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI6 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI6 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
颜酱7 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
喵手8 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控