首页 > 其他分享 >django中的上传文件

django中的上传文件

时间:2024-03-11 16:58:46浏览次数:27  
标签:文件 models django playbook import 序列化 上传 class

用django写接口的时候,不可避免的会涉及到上传文件

环境

python版本 django版本 djangorestframework版本 drf-spectacular版本
3.10.4 3.2 3.14.0 0.27.1

编写模型

from django.db import models


class TimeMixin(models.Model):
    """
    时间混入类,为模型添加创建时间和更新时间字段。

    该类是一个抽象基类,提供了created_at和updated_at字段,这两个字段自动管理创建时间和更新时间。
    """

    class Meta:
        abstract = True  # 标记为抽象类,不会直接创建数据库表

    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')  # 自动设置创建时间
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')  # 自动更新更新时间


class PlaybookRepository(TimeMixin, models.Model):
    """
    playbook仓库模型类,继承自TimeMixin,添加了playbook仓库相关字段。

    这个类描述了数据库中的playbook仓库表,包括仓库的名称、描述和包含的playbook文件。
    """

    class Meta:
        db_table = 'playbook_repository'  # 指定数据库表名
        verbose_name = 'playbook仓库表'  # 用于管理员界面的表名显示

    name = models.CharField(max_length=512, verbose_name='playbook仓库名称', unique=True)  # 库名称,唯一
    description = models.TextField(verbose_name='playbook仓库描述', null=True, blank=True)
    # 新建文件字段,用来上传的playbook文件,存储路径为playbooks下自动按年月日分类
    content = models.FileField(upload_to="playbooks/%Y/%m/%d/", verbose_name='playbook仓库文件',
                               null=False)

上面的模型创建了一个文件字段,并指定了存储路径

编写序列化器

from rest_framework import serializers
from .models import Job, PlaybookRepository
from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes


# 定义一个用于文件上传的字段,因为需要上传,所以扩展了OpenAPI的二进制类型
@extend_schema_field(field=OpenApiTypes.BINARY)
class FileUploadField(serializers.FileField):
    pass

# 定义一个用于创建Playbook仓库的序列化器
class PlaybookRepositoryCreateSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定序列化器使用的模型和字段
        model = PlaybookRepository
        fields = ["name", "description", "content"]

    # 使用FileUploadField作为content字段的类型,要求上传的内容为文件
    content = FileUploadField(required=True)

# 定义一个用于Playbook仓库的通用序列化器
class PlaybookRepositorySerializer(serializers.ModelSerializer):
    class Meta:
        # 指定序列化器使用的模型,并包含模型中的所有字段
        model = PlaybookRepository
        fields = "__all__"

上面包含了两个序列化器:

  • 一个用于创建Playbook仓库的序列化器(PlaybookRepositoryCreateSerializer),它特别包含了文件上传字段(content)
  • 另一个是用于Playbook仓库的通用序列化器(PlaybookRepositorySerializer),它包含了模型中的所有字段。

这里需要特别注意的是,需要重新定义content字段的类型,设置成OpenAPI的二进制类型

编写视图集

from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework import mixins, status
from .models import Job, PlaybookRepository
from .serializers import (
    JobSerializer, JobCreateSerializer, PlaybookRepositorySerializer,
    PlaybookRepositoryCreateSerializer,
)
from drf_spectacular.utils import extend_schema
from .runner import Runner
from rest_framework.parsers import MultiPartParser, JSONParser, FormParser


# 定义一个视图集用于处理PlaybookRepository的视图操作
@extend_schema(tags=['PlaybookRepository'])
class PlaybookRepositoryViewSet(mixins.CreateModelMixin, ReadOnlyModelViewSet):
    """
    PlaybookRepository视图集,支持创建和只读操作。

    mixins.CreateModelMixin提供了创建模型实例的能力,
    ReadOnlyModelViewSet则提供了基于GET请求的只读操作。
    """
    queryset = PlaybookRepository.objects.all()  # 指定视图集查询的对象集合
    serializer_class = PlaybookRepositorySerializer  # 指定用于序列化和反序列化的序列化器
    parser_classes = (MultiPartParser, JSONParser, FormParser, )  # 指定支持的请求解析器类型

    @extend_schema(
            operation_id='CreatePlaybookRepository',
            summary='创建playbook仓库',
            # 指定请求参数,因为是上传文件,所以,这里要使用multipart/form-data类型
            request={"multipart/form-data": PlaybookRepositoryCreateSerializer},
            responses=PlaybookRepositorySerializer
    )
    def create(self, request, *args, **kwargs):
        """
        因为需要修改请求参数以及序列化器,所以这里需要重写一下,所以只是加了个装饰器,然后具体的处理逻辑还是交给父类
        """
        return super().create(request, *args, **kwargs)

这里需要注意的是,需要修改request的参数

settings设置

光有上面的模型、序列化器和视图集还不行

还需要配合全局设置

# settings.py
 
# 设置上传的文件根目录 我们上面模型中设置的 upload_to="playbooks/%Y/%m/%d/",那么上传的文件就会是在 BASE_DIR/'media'/'playbooks'/%Y/%m/%d/ 目录中
MEDIA_ROOT = BASE_DIR / 'media'

SPECTACULAR_SETTINGS = {
    # 设置这个参数,上传的文件就会是在项目目录下,而不是用户的家目录下
    'COMPONENT_SPLIT_REQUEST': True,
}

测试

此时打开swagger文档

就可以看到,已经可以正常上传文件了,并且会在swagger文档中出现上传的按钮,最后保存在数据库中的也是相对 MEDIA_ROOT = BASE_DIR / 'media' 这个路径的路径字符串

标签:文件,models,django,playbook,import,序列化,上传,class
From: https://www.cnblogs.com/guangdelw/p/18066426

相关文章

  • 2024新版Axure RP大数据可视化大屏模板68套及通用组件+PSD文件
    AxureRP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面,但依然秉承“敏捷易用”的制作理念,这套作品也同样延续着我们对细节的完美追求,整个设计制作过程我们同样投入了大量的精力。作品制作前......
  • Java 遍历文件夹内每个文件夹的文件
    在Java中,你可以使用java.nio.file包中的Files和DirectoryStream类来遍历文件夹内的所有文件,包括子文件夹中的文件。以下是一个示例代码,展示了如何实现这个功能:importjava.nio.file.DirectoryStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.f......
  • 代码实现上传Base64图片到七牛云OSS
    依赖<!--https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk--><dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.14.0</version></dependency><......
  • django 动态查询实现过程
    django动态查询实现过程一、背景描述在前端页面上有查询功能,要查询的输入选择有username,address,mobile等,可以通过任意一个查询,或者任意组合进行查询。后端,获取传入的数值。判断哪个有输入,再在数据库中进行查询二、解决方案根据条件,动态实现查询过程condition={}ifusern......
  • linux 通过python 命令定时删除文件,不通过crontab
    importosimporttimelog_dir="/var/log/"defdelete_expired_logs():current_time=time.localtime()print(current_time.tm_hour)ifcurrent_time.tm_hour==12andcurrent_time.tm_min==30:print('xxxxxxxxxx')......
  • 解决uni-app在App端上传图片时路径转Base64的问题
    解决uni-app在App端上传图片时路径转Base64的问题在用uni-app开发项目的时候大家都会遇到这么一个问题,就是上传图片时在App上拿到的是文件路径,然而后端要接收的却是Base64字符串,这就尴尬了,在App端又无法调用WebApi(例如:BlobfileReader等),自己写插件的话又很麻烦,因此我找了很久才......
  • WPF 实现文件/文件夹监听工具
    参考gpt环境软件/系统版本说明WindowsWindows10专业版22H219045.4046MicrosoftVisualStudioMicrosoftVisualStudioCommunity2022(64位)-17.6.5Microsoft.NetSDK8.0.101手动安装Microsoft.NetSDK7.0.306MicrosoftVisualStudio......
  • [oeasy]python0010_怎么用命令行保存文件
    编写py文件......
  • perf report的文件如何在windows下查看
     在Windows下,perfreport 生成的报告文件通常是以二进制格式保存的,无法直接在Windows下查看。不过,你可以将 perf.data 文件转换为文本格式,然后在Windows下使用其他工具进行分析和查看。你可以使用 perfscript 命令将 perf.data 文件转换为文......
  • 用vcpkg 和vs2022,使用msvc编译器,怎么添加新的依赖库(包含头文件与dll)
    安装vcpkg:如果您还没有安装vcpkg,可以通过VisualStudioInstaller安装。在安装或修改VisualStudio时,选择“C++桌面开发”,然后勾选“vcpkg-C++库管理器”1。集成vcpkg到VisualStudio:在VisualStudio中,通过“工具”菜单选择“NuGet包管理器->程序包管......