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)
相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
梧桐树04294 小时前
python常用内建模块:collections
python
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
蓝天星空5 小时前
Python调用open ai接口
人工智能·python
jasmine s5 小时前
Pandas
开发语言·python
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf6 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零16 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
404NooFound6 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
天天要nx6 小时前
D102【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest