Django rest_framework 基础应用

1. Django rest_framework示例

以下是一个使用 Django REST framework 构建简单 API 的示例:

模型

首先,我们需要定义一个 Django 模型来表示我们要处理的数据。例如,我们可以定义一个名为 Book 的模型,包含以下字段:

python 复制代码
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    pub_date = models.DateField()

序列化器

接下来,我们需要定义一个序列化器类来将 Book 模型转换为 JSON 格式。例如,我们可以定义一个名为 BookSerializer 的序列化器类:

python 复制代码
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

视图

然后,我们需要定义一个视图类来处理 API 请求和响应。例如,我们可以定义一个名为 BookListView 的视图类,用于获取所有图书信息:

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookListView(APIView):
    def get(self, request):
        try:
            books = Book.objects.all()
            serializer = BookSerializer(books, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Book.DoesNotExist:
            return Response({"error": "Book not found"}, status=status.HTTP_404_NOT_FOUND)

class BookCreateView(APIView):
    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response({"error": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

URL 配置

最后,我们需要在 URLconf 中配置 API 路由。例如,我们可以将 BookListView 绑定到 /books/ URL:

python 复制代码
from django.urls import path
from .views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

运行示例

现在,我们可以启动 Django 服务器并访问 /books/ URL 来获取所有图书信息。例如,我们可以使用以下命令启动服务器:

复制代码
python manage.py runserver

然后,我们可以使用以下 URL 访问 API:

复制代码
http://localhost:8000/books/

这将返回以下 JSON 格式的数据:

json 复制代码
[
  {
    "id": 1,
    "title": "Python 教程",
    "author": "John Doe",
    "pub_date": "2023-10-27"
  },
  {
    "id": 2,
    "title": "Django 教程",
    "author": "Jane Doe",
    "pub_date": "2023-10-28"
  }
]

2. 基础函数讲解

BookListView.as_view() 解释

BookListView.as_view() 是一个方法,它将 BookListView 类转换为一个视图函数。视图函数是 Django 中处理请求的函数。

使用方法

以下是如何使用 BookListView.as_view() 的示例:

python 复制代码
from django.urls import path
from .views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

这将创建一个名为 books 的 URL 模式,它将所有对 /books/ URL 的请求路由到 BookListView 类。

内部机制

BookListView.as_view() 方法内部使用了以下步骤:

  1. 创建一个 BookListView 类的实例。
  2. 调用实例的 dispatch() 方法。
  3. dispatch() 方法根据请求方法(例如 GET、POST 等)调用相应的处理方法(例如 get()post() 等)。
  4. 处理方法返回一个响应对象。

BookListView 类中的函数

BookListView 类继承自 APIView 类,它包含以下函数:

  • get(): 处理 GET 请求。
  • post(): 处理 POST 请求。
  • put(): 处理 PUT 请求。
  • patch(): 处理 PATCH 请求。
  • delete(): 处理 DELETE 请求。
  • head(): 处理 HEAD 请求。
  • options(): 处理 OPTIONS 请求。

可以在 BookListView 类中重写这些函数来处理不同的 HTTP 请求。例如,可以重写 get() 函数来获取所有图书信息:

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .serializers import BookSerializer

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

还可以使用 dispatch() 方法来处理所有 HTTP 请求:

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .serializers import BookSerializer

class BookListView(APIView):
    def dispatch(self, request, *args, **kwargs):
        if request.method == 'GET':
            return self.get(request, *args, **kwargs)
        elif request.method == 'POST':
            return self.post(request, *args, **kwargs)
        else:
            return super().dispatch(request, *args, **kwargs)

BookListView 类包含了处理不同 HTTP 请求的函数。可以根据需求重写这些函数或使用 dispatch() 方法来处理所有 HTTP 请求。

参数

as_view() 函数可以接受以下参数:

  • actions: 一个字典,用于指定每个 HTTP 方法对应的处理方法。例如,可以使用以下代码指定 get() 方法处理 GET 请求,post() 方法处理 POST 请求:
python 复制代码
BookListView.as_view(actions={'get': 'my_get_method', 'post': 'my_post_method'})

get请求会使用my_get_method函数,POST请求会使用my_post_method函数。

  • initkwargs: 一个字典,用于传递给视图类构造函数的参数。例如,可以使用以下代码传递 queryset 参数给 BookListView 类:
python 复制代码
BookListView.as_view(initkwargs={'queryset': Book.objects.all()})
initkwargs 参数传递举例
需求

假设我们有一个名为 BookListView 的视图类,它用于获取所有图书信息。我们希望将 queryset 参数和 author 参数传递给 BookListView 类,以便在视图中使用它们。

步骤
  1. 定义 BookListView 类:
python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .serializers import BookSerializer

class BookListView(APIView):
    def get(self, request):
        books = self.queryset.filter(author=self.author)
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)
  1. 使用 initkwargs 参数传递 queryset 参数和 author 参数:
python 复制代码
from django.urls import path
from .views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view(initkwargs={'queryset': Book.objects.all(), 'author': 'John Doe'})),
]
  1. 在视图中使用 queryset 参数和 author 参数:
python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .serializers import BookSerializer

class BookListView(APIView):
    def get(self, request):
        books = self.queryset.filter(author=self.author)
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)
相关推荐
困死,根本不会30 分钟前
蓝桥杯python备赛笔记之(十)数论基础 & 日期问题
笔记·python·蓝桥杯
輕華34 分钟前
Python 命令行参数处理:sys.argv 与 argparse 深度对比
python
清水白石0081 小时前
Python 内存陷阱深度解析——浅拷贝、深拷贝与对象复制的正确姿势
开发语言·python
国家二级编程爱好者1 小时前
删除typora文档没有引用的资源文件
git·python
进击的雷神1 小时前
邮箱编码解码、国际电话验证、主办方过滤、多页面深度爬取——柬埔寨塑料展爬虫四大技术难关攻克纪实
爬虫·python
深蓝电商API2 小时前
多线程 vs 异步 vs 多进程爬虫性能对比
爬虫·python
进击的雷神2 小时前
相对路径拼接、TEL前缀清洗、多链接过滤、毫秒级延迟控制——日本东京塑料展爬虫四大技术难关攻克纪实
爬虫·python
云溪·2 小时前
Milvus向量数据库混合检索召回案例
python·ai·milvus
柒.梧.2 小时前
Java集合核心知识点深度解析:数组与集合区别、ArrayList原理及线程安全问题
java·开发语言·python
AsDuang3 小时前
Python 3.12 MagicMethods - 49 - __imatmul__
开发语言·python