当前位置:首页 > 技术 > 正文内容

使用Django REST框架构建高效API

访客 技术 2026年10月3日 1

1. Django REST框架入门

1.1 使用Django开发REST接口

通过图书管理系统案例演示如何实现数据的增删改查接口。前后端交互采用JSON格式。

# views.py
from datetime import datetime

class BookListView(View):
    """查询书籍列表并新增书籍"""
    def get(self, request):
        books = Book.objects.all()
        result = []
        for item in books:
            result.append({
                'id': item.id,
                'title': item.title,
                'publish_date': item.publish_date,
                'views': item.views,
                'comments': item.comments,
                'cover': item.cover.url if item.cover else ''
            })
        return JsonResponse(result, safe=False)

    def post(self, request):
        data = json.loads(request.body)
        new_book = Book.objects.create(
            title=data['title'],
            publish_date=datetime.strptime(data['date'], '%Y-%m-%d').date()
        )
        return JsonResponse({
            'id': new_book.id,
            'title': new_book.title,
            'publish_date': new_book.publish_date,
            'views': new_book.views,
            'comments': new_book.comments,
            'cover': new_book.cover.url if new_book.cover else ''
        }, status=201)


class BookDetailView(View):
    def get(self, request, book_id):
        try:
            book = Book.objects.get(id=book_id)
        except Book.DoesNotExist:
            return HttpResponse(status=404)
        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'publish_date': book.publish_date,
            'views': book.views,
            'comments': book.comments,
            'cover': book.cover.url if book.cover else ''
        })

    def put(self, request, book_id):
        try:
            book = Book.objects.get(id=book_id)
        except Book.DoesNotExist:
            return HttpResponse(status=404)
        data = json.loads(request.body)
        book.title = data['title']
        book.publish_date = datetime.strptime(data['date'], '%Y-%m-%d').date()
        book.save()
        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'publish_date': book.publish_date,
            'views': book.views,
            'comments': book.comments,
            'cover': book.cover.url if book.cover else ''
        })

    def delete(self, request, book_id):
        try:
            Book.objects.get(id=book_id).delete()
            return HttpResponse(status=204)
        except Book.DoesNotExist:
            return HttpResponse(status=404)
# urls.py
urlpatterns = [
    path('books/', views.BookListView.as_view()),
    path('books//', views.BookDetailView.as_view())
]

测试用例

  1. 获取所有书籍:GET /books/ 返回状态码200
  2. 获取单本书籍:GET /books/5/ 返回状态码200
  3. 新增书籍:POST /books/ 发送JSON数据,返回状态码201
  4. 修改书籍:PUT /books/8/ 发送JSON数据,返回状态码200
  5. 删除书籍:DELETE /books/8/ 返回状态码204

1.2 REST接口开发核心任务

主要包含三个操作流程:

  • 将请求数据转换为模型对象
  • 执行数据库操作
  • 将模型对象转换为响应数据

序列化与反序列化

序列化:将模型对象转换为JSON格式

books = Book.objects.all()
serialized = [serialize_book(book) for book in books]
return JsonResponse(serialized, safe=False)

反序列化:将JSON数据转换为模型对象

data = json.loads(request.body)
new_book = Book.objects.create(**data)

2. Django REST Framework基础

2.1 环境配置

pip install djangorestframework

在settings.py中添加:

INSTALLED_APPS += ['rest_framework']

2.2 快速体验DRF

# serializers.py
from rest_framework import serializers

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
# views.py
from rest_framework.viewsets import ModelViewSet

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
# urls.py
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns += router.urls

3. 序列化器详解

3.1 字段定义

字段类型示例
CharFieldname = serializers.CharField(max_length=100)
IntegerFieldpages = serializers.IntegerField()
DateFieldpublish_date = serializers.DateField()

3.2 关联对象处理

  • PrimaryKeyRelatedField: 返回关联对象ID
  • StringRelatedField: 返回关联对象字符串表示
  • NestedSerializer: 嵌套序列化关联对象

3.3 数据验证

def validate_title(self, value):
    if 'django' not in value.lower():
        raise serializers.ValidationError("必须包含Django关键词")
    return value

4. 视图组件

4.1 核心视图类

  • APIView: 基础视图类
  • GenericAPIView: 提供通用方法
  • ModelViewSet: 集成增删改查

4.2 视图集使用

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    @action(methods=['get'], detail=False)
    def recent(self, request):
        latest_book = Book.objects.last()
        serializer = self.get_serializer(latest_book)
        return Response(serializer.data)

4.3 路由配置

router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
    path('', include(router.urls)),
]

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。