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)
相关推荐
来自天蝎座的孙孙1 小时前
洛谷P1595讲解(加强版)+错排讲解
python·算法
张子夜 iiii2 小时前
机器学习算法系列专栏:主成分分析(PCA)降维算法(初学者)
人工智能·python·算法·机器学习
跟橙姐学代码3 小时前
学Python像学做人:从基础语法到人生哲理的成长之路
前端·python
Keying,,,,3 小时前
力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
python·算法·leetcode·矩阵
桃源学社(接毕设)4 小时前
基于人工智能和物联网融合跌倒监控系统(LW+源码+讲解+部署)
人工智能·python·单片机·yolov8
yunhuibin4 小时前
pycharm2025导入anaconda创建的各个AI环境
人工智能·python
杨荧4 小时前
基于Python的电影评论数据分析系统 Python+Django+Vue.js
大数据·前端·vue.js·python
python-行者4 小时前
akamai鼠标轨迹
爬虫·python·计算机外设·akamai
R-G-B5 小时前
【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
python·opencv·视频加载·摄像头调用·获取视频基本信息·获取视频帧率·获取视频帧数
赵英英俊5 小时前
Python day46
python·深度学习·机器学习