Django--ApiView示例

1. 代码示例

python 复制代码
from django.contrib.auth.models import User
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from .models import BookInfo

class BookInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookInfo
        fields = '__all__'

class BookListView(APIView):
    def get(self, request):
        books = BookInfo.objects.all()
        serializer = BookInfoModelSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookInfoModelSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class BookDetailView(APIView):
    def get(self, request, pk):
        try:
            book = BookInfo.objects.get(pk=pk)
            serializer = BookInfoModelSerializer(book)
            return Response(serializer.data)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

    def put(self, request, pk):
        try:
            book = BookInfo.objects.get(pk=pk)
            serializer = BookInfoModelSerializer(book, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

    def delete(self, request, pk):
        try:
            book = BookInfo.objects.get(pk=pk)
            book.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

2. 代码详解

详细解释

这段代码是一个使用 APIView 构建 API 视图的示例,它可以用于构建 RESTful API。

1. 导入模块

  • from django.contrib.auth.models import User: 导入 User 模型,用于用户身份验证。
  • from rest_framework import serializers: 导入序列化器模块,用于将模型实例转换为可序列化的数据格式。
  • from rest_framework.views import APIView: 导入 APIView 基类,用于构建 API 视图。
  • from rest_framework.response import Response: 导入 Response 类,用于生成 HTTP 响应。
  • from rest_framework import status: 导入 HTTP 响应状态码。
  • from .models import BookInfo: 导入 BookInfo 模型,用于定义书籍信息。

2. 定义序列化器

  • class BookInfoModelSerializer(serializers.ModelSerializer): 定义一个名为 BookInfoModelSerializer 的序列化器类,用于序列化和反序列化 BookInfo 模型实例。
  • class Meta: 元类,用于配置序列化器类的属性。
  • model = BookInfo: 要序列化的模型类。
  • fields = '__all__': 要序列化的字段列表。默认情况下,fields 属性设置为 '__all__',表示序列化所有字段。也可以将 fields 属性设置为一个字段列表,以只序列化指定的字段。

3. 定义 API 视图

  • class BookListView(APIView): 定义一个名为 BookListView 的 API 视图,用于获取所有书籍信息。
  • def get(self, request): 定义 get 方法,用于处理 GET 请求。
  • books = BookInfo.objects.all(): 查询所有 BookInfo 对象。
  • serializer = BookInfoModelSerializer(books, many=True): 使用 BookInfoModelSerializer 序列化所有书籍信息,并设置 many=True 参数,表示序列化多个对象。
  • return Response(serializer.data): 返回一个包含序列化数据的响应。

4. 创建新的书籍信息

  • def post(self, request): 定义 post 方法,用于处理 POST 请求。
  • serializer = BookInfoModelSerializer(data=request.data): 使用 BookInfoModelSerializer 验证请求数据。
  • if serializer.is_valid(): 如果数据有效,则保存数据。
  • serializer.save(): 保存数据。
  • return Response(serializer.data, status=status.HTTP_201_CREATED): 返回一个包含序列化数据的响应,并设置状态码为 201(已创建)。
  • return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST): 如果数据无效,则返回一个包含错误信息的响应,并设置状态码为 400(错误请求)。

5. 获取单个书籍信息

  • class BookDetailView(APIView): 定义一个名为 BookDetailView 的 API 视图,用于获取、更新和删除单个书籍信息。
  • def get(self, request, pk): 定义 get 方法,用于处理 GET 请求,并接受一个 pk 参数,表示要获取的书籍的 ID。
  • try: 尝试查询指定 pkBookInfo 对象。
  • book = BookInfo.objects.get(pk=pk): 查询指定 pkBookInfo 对象。
  • serializer = BookInfoModelSerializer(book): 使用 BookInfoModelSerializer 序列化书籍信息。
  • return Response(serializer.data): 返回一个包含序列化数据的响应。
  • except BookInfo.DoesNotExist: 如果书籍不存在,则返回一个 404(未找到)响应。

6. 更新单个书籍信息

  • def put(self, request, pk): 定义 put 方法,用于处理 PUT 请求,并接受一个 pk 参数,表示要更新的书籍的 ID。
  • try: 尝试查询指定 pkBookInfo 对象。
  • book = BookInfo.objects.get(pk=pk): 查询指定 pkBookInfo 对象。
  • serializer = BookInfoModelSerializer(book, data=request.data): 使用 BookInfoModelSerializer 验证请求数据,并使用 book 对象作为初始数据。
  • if serializer.is_valid(): 如果数据有效,则更新数据。
  • serializer.save(): 更新数据。
  • return Response(serializer.data): 返回一个包含序列化数据的响应。
  • return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST): 如果数据无效,则返回一个包含错误信息的响应,并设置状态码为 400(错误请求)。
  • except BookInfo.DoesNotExist: 如果书籍不存在,则返回一个 404(未找到)响应。

7. 删除单个书籍信息

  • def delete(self, request, pk): 定义 delete 方法,用于处理 DELETE 请求,并接受一个 pk 参数,表示要删除的书籍的 ID。
  • try: 尝试查询指定 pkBookInfo 对象。
  • book = BookInfo.objects.get(pk=pk): 查询指定 pkBookInfo 对象。
  • book.delete(): 删除书籍信息。
  • return Response(status=status.HTTP_204_NO_CONTENT): 返回一个 204(无内容)响应,表示书籍已删除。
  • except BookInfo.DoesNotExist: 如果书籍不存在,则返回一个 404(未找到)响应。

总结

这段代码是一个使用 APIView 构建 API 视图的示例,它可以用于构建 RESTful API。它包括以下功能:

  • 获取所有书籍信息
  • 创建新的书籍信息
  • 获取单个书籍信息
  • 更新单个书籍信息
  • 删除单个书籍信息
相关推荐
研究点啥好呢1 分钟前
3月22日GitHub热门项目推荐|网页浏览,何须手动
人工智能·python·开源·github
zabr3 分钟前
花了 100+ 篇笔记,我整理出 了一套 AI Agent 工程完全指南
前端·后端·agent
三块可乐两块冰5 分钟前
【机器学习笔记三十二】机器学习三十二
python
love530love14 分钟前
ComfyUI-3D-Pack:Windows 下手动编译 mesh_inpaint_processor C++ 加速模块
c++·人工智能·windows·python·3d·hunyuan3d·comfyui-3d-pack
神奇小汤圆16 分钟前
Java面试题及答案整理(2026年金三银四最新版,持续更新)
后端
uzong19 分钟前
“腾讯QClaw全面开放”,不花 Token 钱、真正体验一把小龙虾的快乐,最低成本全面了解龙虾
人工智能·后端
楼田莉子20 分钟前
C++高并发内存池:内存池调优与测试
c++·后端·哈希算法·visual studio
vx_biyesheji000124 分钟前
计算机毕业设计:Python多源新闻数据智能舆情挖掘平台 Flask框架 爬虫 SnowNLP ARIMA 可视化 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·数据分析·django·flask·课程设计
短剑重铸之日24 分钟前
《ShardingSphere解读》16 改写引擎:如何理解装饰器模式下的 SQL 改写实现机制?
java·数据库·后端·sql·shardingsphere·分库分表·装饰器模式
m0_5879589525 分钟前
机器学习与人工智能
jvm·数据库·python