前言
django进行文件上传,单文件上传,直接使用DRF即可。
特点
- 在迁移数据库时,会根据model中FileField字段的upload_to属性的值,在对应的路径创建文件夹,用于存放通过该接口上传的文件
- upload_to属性,支持日期格式化,比如"upload/%Y%m/",意思就是在当前项目路径下生成
upload/当前年当前月
的文件夹 - 在上传文件时,如果对应的文件夹下存在同名的文件,则DRF会自动重命名该文件,也就是在文件名后添加"_xxxxxx"的后缀,xxxx是自动生成的,比如说"page_sfd343NKD.jpg"
- 多文件上传时,只会保留最新的一个文件。如果要实现多文件上传,需自己写或重写代码
步骤
ps. 这里我需要name和id两个字段,如果不需要的则可以去掉
1、创建model
ps. 忽略 BaseModel,只是封装了必备字段而已
from django.db import models
from utils.base_model import BaseModel
class Files(BaseModel):
id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
name = models.CharField(verbose_name='文件名称', max_length=200, help_text='文件名称')
# upload_to 会生成指定路径文件夹,文件会保存在其中,如果文件名称重复则会自动添加后缀
file = models.FileField(upload_to="upload/%Y%m%d/")
class Meta:
db_table = 'tb_files'
ordering = ['-update_time']
verbose_name = "模块"
verbose_name_plural = verbose_name
2、创建序列化器
from rest_framework import serializers
from .models import Files
class FileSerializer(serializers.ModelSerializer):
class Meta:
model = Files
exclude = ('create_time', 'is_delete')
3、创建视图类
from rest_framework import generics
from . import serializers
from .models import Files
class FileView(generics.CreateAPIView):
queryset = Files.objects.filter(is_delete=False)
serializer_class = serializers.FileSerializer
4、创建url
from django.urls import path
from . import views
urlpatterns = [
path(r'file/', views.FileView.as_view())
]
5、配置 和 数据库迁移
- setting.py 注册文件上传app
- 根urls.py 文件中配置文件上传url
- 执行
python manage.py makemigrations
python manage.py migrate