我安装了 django djangorestframework markdown pygments django-filter

# 创建项目,直接创建
django-admin startproject <dj_learn>
 
# 自动创建数据库表
python manage.py makemigrations
python manage.py migrate
 
# 创建管理员(admin byack89HKC)
python manage.py createsuperuser

修改 settings.py 一些内容

ALLOWED_HOSTS = ['*']
 
LANGUAGE_CODE = 'zh-hans'
 
TIME_ZONE = 'Asia/Shanghai'
 
USE_TZ = False
 
STATIC_ROOT = os.path.join(BASE_DIR, 'static')  # 静态文件路径
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'staticfiles')
]

所有 REST 相关的配置文件放在这个字典里

# REST API 所有相关的配置
# 全局配置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',  # 自带的分页类
    'PAGE_SIZE': 10,  # 默认每页大小
    'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',  # 默认时间格式
    'DEFAULT_RENDERER_CLASSES': (  # 默认渲染器 Render 类
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PARSER_CLASSES': (  # 默认解析器 Parser 类,解析 request.data
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',  # 上传文件
    ),
    'DEFAULT_PERMISSION_CLASSES': [  # 默认权限
        'rest_framework.permissions.IsAuthenticated',  # 必须登录后才能访问
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [  # 默认认证
        'rest_framework.authentication.BasicAuthentication',  # 基本认证
        'rest_framework.authentication.SessionAuthentication',  # 会话认证
    ]
}

创建一个简单的课程信息 APP

python manage.py startapp course

修改该应用的信息 app.py

class CourseConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'course'
    verbose_name = '课程信息'

创建模型类

from django.db import models
from django.contrib.auth.models import User
 
 
# Create your models here.
 
class course(models.Model):
    name = models.CharField(max_length=20, unique=True, help_text='课程名称', verbose_name='课程名称')
    introduction = models.TextField(help_text='课程介绍', verbose_name='课程介绍')
    # 老师关联外键到默认的用户组
    teacher = models.ForeignKey(User, on_delete=models.CASCADE, help_text='课程讲师', verbose_name='课程讲师')
    # 价格最多6为数字,小数点后面占2位
    price = models.DecimalField(max_digits=6, decimal_places=2, help_text='课程价格', verbose_name='课程价格')
    created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间', verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, help_text='更新时间', verbose_name='更新时间')
 
    # 元数据
    class Meta:
        verbose_name = '课程信息'
        verbose_name_plural = verbose_name
        ordering = ('price',)  # 按价格排序
    
    def __str__(self):
        return self.name

将这些字段放入后台,方便我们可以在后台添加数据 admin.py

from django.contrib import admin
from .models import Course
 
# Register your models here.
 
@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
    list_display = ['name', 'introduction', 'teacher', 'price', 'created_at', 'updated_at']  # 显示字段
    search_fields = ['name', 'introduction', 'teacher']  # 搜索字段
    list_filter = list_display  # 过滤的字段

完成后我们直接生成数据表,但是需要将该APP加入到项目settings.py里的INSTALLED_APP

python manage.py makemigrations
python manage.py migrate

对模型的字段进行序列化,主要是将查询集 queryset 和模型实例 instance 序列化成 json 格式,方便按统一的格式传递给前端,一般情况下,序列化我们是在对应的应用里创建 serializers.py

from rest_framework import serializers
from .models import Course
 
# 在这里序列化模型
 
class CourseSerializer(serializers.HyperlinkedModelSerializer):
    # 外键字段,所以只读
    teacher = serializers.ReadOnlyField(source='teacher.username')
 
    class Meta:
        model = Course
        # 这个地方的 url 并不是固定的,只是一个默认值
        fields = ['id', 'url', 'name', 'introduction', 'teacher', 'price', 'created_at', 'updated_at']

某个用户只能修改自己创建的课程,所有需要权限管理,在对应的应用里创建 permissions.py

from rest_framework import permissions
 
# 在这里自定义权限
 
class IsOwnerOrReadOnly(permissions.BasePermission):
    """ 只允许对象所有者能够编辑 """
 
    def has_object_permission(self, request, view, obj):
        # 任何人都可以读
        if request.method in permissions.SAFE_METHODS:
            return True
        # 对象所有者才拥有写权限
        return obj.teacher == request.user

自定义权限后,在视图 view.py 中处理

# 使用 ViewSet 来创建接口
class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    permission_classes = [IsOwnerOrReadOnly]  # 局部权限设置优先于全局设置
 
    def perform_create(self, serializer):
        serializer.save(teacher=self.request.user)

最后在 urls.py 中注册路由即可

然后自动生成 API 文档

pip install coreapi

在全局中进行配置

REST_FRAMEWORK = {
    #指定用于支持coreapi的Schema
    'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
}

配置路由即可

from rest_framework.documentation import include_docs_urls
 
path('docs/', include_docs_urls(title="API文档", description="API文档"))

跨域问题解决办法,参考文章:地址


token登录认证:

django 处理文件上传 Django 使用 Django FileField 还是 FilePathField