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)
相关推荐
欧阳枫落7 分钟前
python 2小时学会八股文-数据结构
开发语言·数据结构·python
天天要nx11 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
feifeikon1 小时前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
杰仔正在努力1 小时前
python成长技能之枚举类
开发语言·python
Eiceblue1 小时前
通过Python 调整Excel行高、列宽
开发语言·vscode·python·pycharm·excel
Jam-Young2 小时前
Python中的面向对象编程,类,对象,封装,继承,多态
开发语言·python
Light602 小时前
低代码牵手 AI 接口:开启智能化开发新征程
人工智能·python·深度学习·低代码·链表·线性回归
墨绿色的摆渡人2 小时前
用 Python 从零开始创建神经网络(六):优化(Optimization)介绍
人工智能·python·深度学习·神经网络
小han的日常2 小时前
pycharm分支提交操作
python·pycharm
明月清风徐徐3 小时前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy