Django rest_framework 基础应用

1. Django rest_framework示例

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

模型

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

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 的序列化器类:

from rest_framework import serializers
from .models import Book

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

视图

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

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:

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 格式的数据:

[
  {
    "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() 的示例:

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() 函数来获取所有图书信息:

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 请求:

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 请求:
BookListView.as_view(actions={'get': 'my_get_method', 'post': 'my_post_method'})

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

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

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

步骤
  1. 定义 BookListView 类:
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 参数:
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 参数:
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. DjangoRestFramework概括

    2024-05-25 20:06:27       41 阅读
  2. django接入djangorestframework-simplejwt步骤

    2024-05-25 20:06:27       8 阅读
  3. DjangoRestFramework(drf实现五个接口)

    2024-05-25 20:06:27       32 阅读
  4. 【Databend】基础函数应用

    2024-05-25 20:06:27       36 阅读
  5. canvas基础应用

    2024-05-25 20:06:27       20 阅读
  6. Web基础应用

    2024-05-25 20:06:27       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 20:06:27       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 20:06:27       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 20:06:27       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 20:06:27       20 阅读

热门阅读

  1. P2P 技术:点对点网络的兴起

    2024-05-25 20:06:27       9 阅读
  2. Android 录音AudioRecord

    2024-05-25 20:06:27       11 阅读
  3. 【Python】—— 推导式

    2024-05-25 20:06:27       9 阅读
  4. 美易官方:Copilot全面升级!

    2024-05-25 20:06:27       11 阅读
  5. Ros2_学习梳理_2_服务通信(赵虚左老师)

    2024-05-25 20:06:27       10 阅读
  6. uniapp 微信小程序设置 TabItem 红点

    2024-05-25 20:06:27       12 阅读
  7. Netty:AIO

    2024-05-25 20:06:27       12 阅读
  8. 前端常用的状态码

    2024-05-25 20:06:27       10 阅读
  9. 测试驱动开发(TDD)的探析

    2024-05-25 20:06:27       11 阅读