Django一分钟:DRF生成OpenAPI接口文档

DRF项目中如果想要自动生成API文档我们可以借助drf-spectacular这个库,drf-spectacular非常强大,它可以自动从DRF中提取信息,自动生成API文档,配置简单开箱即用,并且它对很多常用的第三方如:SimpleJWTdjango-filter等做了适配。

下面的示例中我们将创建一个一些接口,由django-filter实现过滤功能,并且使用drf-spectacular创建接口文档。

1. 下载依赖

shell 复制代码
pip install drf-spectacular[sidecar]
pip install django-filter

2. 配置settings.py

python 复制代码
# APP配置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "api.apps.BlogConfig",# 你的app

    'rest_framework',
    'drf_spectacular',
    'drf_spectacular_sidecar',
]

# DRF配置
REST_FRAMEWORK = {
    ...
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
    ...
}

# SPECTACULAR配置
SPECTACULAR_SETTINGS = {
    'TITLE': 'Your Project API',
    'DESCRIPTION': 'Your project description',
    'VERSION': '1.0.0',
    'SERVE_INCLUDE_SCHEMA': False,
}

3. 创建模型

python 复制代码
from django.db import models
from django_filters import rest_framework as filters
from rest_framework import serializers


class Order(models.Model):
    name = models.CharField(max_length=100)


class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    create_at = models.DateTimeField(auto_now_add=True)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)

4. 创建过滤器

python 复制代码
class ProductFilter(filters.FilterSet):
    class Meta:
        model = Product
        fields = {
            'price': ['lt', 'gt'],
            'create_at': ['lt', 'gt'],
            'order__name': ['exact'],
        }

5. 创建序列化器

python 复制代码
class OrderSer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = '__all__'

    def create(self, validated_data):
        return Order.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance


class ProductReadSer(serializers.ModelSerializer):
    order = OrderSer(read_only=True)

    class Meta:
        model = Product
        fields = '__all__'


class ProductCreateSer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['price', 'order']

    def create(self, validated_data):
        return Product.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.price = validated_data.get('price', instance.price)
        instance.order = validated_data.get('order', instance.order)
        instance.save()
        return instance

6. 创建路由

python 复制代码
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
from api.views import OrderViewSet, ProductReadViewSet, ProductCreateViewSet
router = DefaultRouter()
router.register(r'orders', OrderViewSet)
router.register(r'products/read', ProductReadViewSet, basename='product-read')
router.register(r'products/create', ProductCreateViewSet, basename='product-create')

# 后台管理
urlpatterns = [
    path('admin/', admin.site.urls),
]

# API接口
urlpatterns += [
    path('api/', include(router.urls)),
]

# API文档
urlpatterns += [
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]

7. 数据库迁移

shell 复制代码
python manage.py makemigrations XXX
python manage.py migrate

8. 使用示例

启动项目打开我们配置的文档地址可以看到注册到路由中的接口其文档已经被自动创建好了。

配置了过滤器的接口也在文档中有所反映:

相关参考文档地址

相关推荐
阳光男孩013 小时前
MySQL基础之约束
android·数据库·mysql
AI人H哥会Java3 小时前
【PostgreSQL】运维篇—— 实战案例分析:从需求到实现
运维·数据库·sql·postgresql
bug菌¹4 小时前
滚雪球学Redis[1.1讲]:什么是Redis?
数据库·redis·缓存
zeroner_6 小时前
【SQL】DDL语句
数据库·sql·mysql
七折困6 小时前
DBMS-3.2 SQL(2)——DML的SELECT(含WHERE、聚集函数、GROUP BY、HAVING之间的关系)
数据库·sql·mysql
丶21366 小时前
【SQL】掌握SQL查询技巧:数据分组与排序
数据库·后端·sql
Davina_yu6 小时前
finereport制作带刷新和滚动的明细表
数据库·数据分析
杀死这个程序员6 小时前
Mysql和Oracle使用差异和主观感受
数据库·mysql·oracle
菜♕卷7 小时前
Redis-02 持久化
数据库·redis·缓存
爬树的小蚂蚁7 小时前
OceanBase 3.2.2 数据库问题处理记录
数据库·git·oceanbase