跳转至

DRF

pip install djangorestframework

  • settings.py
INSTALLED_APPS = [
    # ...
    'rest_framework',
    # ...
]
  • models.py
from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
  • serializers.py
from rest_framework import serializers
from .models import BlogPost


# 序列化器用于将模型实例转换成 JSON 格式的数据,以及将 JSON 数据解析回模型实例。
# BlogPostSerializer 类将处理 BlogPost 模型的序列化和反序列化
class BlogPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost  # 指定模型
        fields = ['id', 'title', 'content', 'created_at']  # 指定想要包含在序列化中的字段
  • permissions.py
from rest_framework.permissions import BasePermission

class IsOwnerOrReadOnly(BasePermission):
    """
    自定义权限,只允许对象的所有者编辑它。
    """

    def has_object_permission(self, request, view, obj):
        # 读取权限允许任何请求,
        # 所以我们总是允许 GET, HEAD 或 OPTIONS 请求。
        if request.method in SAFE_METHODS:
            return True

        # 写入权限只允许给 obj 的所有者。
        return obj.owner == request.user
  • views.py
from rest_framework import viewsets
from .models import BlogPost
from .serializers import BlogPostSerializer
from .permissions import IsOwnerOrReadOnly

# 视图集(ViewSet)是一种特殊类型的视图,它抽象化并组合了处理常见的 HTTP 请求(如 GET、POST、PUT、DELETE)的逻辑。
# 主要目的是简化视图的代码,使得你不需要为每种类型的 HTTP 请求单独编写视图函数。
"""
在这个例子中,BlogPostViewSet 继承自 ModelViewSet,
它自动提供了以下一些操作
    list(列出所有博客帖子)
    create(创建新博客帖子)
    retrieve(获取特定博客帖子的详情)
    update(更新博客帖子)
    destroy(删除博客帖子)
"""
class BlogPostViewSet(viewsets.ModelViewSet):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer
    permission_classes = [IsOwnerOrReadOnly]
  • urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BlogPostViewSet

# DRF带的路由器,自动为视图集的各种操作提供了相应的URL路由
router = DefaultRouter()
router.register(r'blogposts', BlogPostViewSet)  # 所有路由以blogposts开始,比如/blogposts/{id}/

urlpatterns = [
    path('', include(router.urls)),
]