这里主要用到DRF框架
模型层(models.py)
from django.db import models
from django.utils.timezone import now
class Files(models.Model):
"""
Author: czj
文件存储模型
"""
#设置筛选器
del_choices = (('0', '未删除'),('1', '已删除'))
type_choices = (('category1', '类别1'),('category2', '类别2'))
#文件相关信息/类型和类型ID用来关联别的模型
title = models.CharField(max_length=255, verbose_name='文件名称', help_text='文件名称', blank=True)
extension = models.CharField(max_length=30, verbose_name='后缀名', help_text='后缀名', blank=True)
size = models.CharField(max_length=30,verbose_name='文件大小', help_text='文件大小',null=True, blank=True)
fileType = models.CharField(max_length=30,verbose_name='所属类型',help_text='类型(所属类型CharField,可选值:problem,patrol)', choices=type_choices, default='problem')
typeId = models.IntegerField(verbose_name='类型ID',help_text='类型ID', default='0')
#'file/'+now最终显示文件路径为file/2020_06,为动态存储路径,避免一个文件夹太多过重
now = str(now().strftime('%Y_%m'))
fileUrl = models.FileField(upload_to='file/'+now, verbose_name='文件路径', help_text='文件路径(FileField)', null=True, blank=True)
#实例生成信息
createdBy = models.CharField(max_length=30, verbose_name='创建者', help_text='创建者(CharField)', blank=True)
createdDate = models.DateTimeField(verbose_name='创建时间', help_text='创建时间(DateTimeField)', auto_now_add=True,null=True, blank=True)
lastEditedBy = models.CharField(max_length=30, verbose_name='最后编辑人', help_text='最后编辑人(CharField', blank=True)
lastEditedDate = models.DateTimeField(verbose_name='最后编辑时间', help_text='最后编辑时间(DateTimeField)', auto_now=True,null=True, blank=True)
deleted = models.CharField(max_length=1, verbose_name='是否删除', help_text='是否删除(CharField,可选值:0,1)', choices=del_choices, default='0')
class Meta:
verbose_name = '文件存储'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
如果需要用admin系统进行测试,这里再注册下admin
from django.contrib import admin
@admin.register(Files)
class FilesAdminModel(admin.ModelAdmin):
"""
Author: czj
注册文件模型到admin
"""
list_per_page = 20 #设置分页,可以不用
list_display = ('title', 'extension', 'size','fileType','typeId', 'fileUrl', 'createdBy', 'createdDate', 'lastEditedBy', 'lastEditedDate', 'deleted')
序列化器(serializers.py)
在应用文件夹内创建serializers.py
from .models import *
from rest_framework import serializers
class FilesSerializer(serializers.ModelSerializer):
"""
文件存储序列化器
Author:czj
"""
class Meta:
model = Files
fields = '__all__'
#这里重写创建实例
def create(self, validated_data):
'''文件传输重写创建实例'''
file_ = Files() #避免和file冲突
#传入参数
file_.createdBy = self.context["request"].user.username
file_.lastEditedBy = self.context["request"].user.username
file_.fileUrl = validated_data["fileUrl"]
file_.save()
flie_record = Files.objects.get(id=file_.id) # 获取上传的数据记录
'''系统传入'''
duoyu = 'file/'+str(now().strftime('%Y_%m'))+'/' #这里用于在切片后处理多余字段
file_.title = str(flie_record.fileUrl.name).split(".",1)[0].replace(duoyu,'') #后缀名
file_.extension = str(flie_record.fileUrl.name).split(".",1)[1] #后缀名
import os
KB = round(float(flie_record.fileUrl.size)/float(1024),2)
if KB>1024:
MB = round(KB/float(1024),2)
file_.size = str(MB)+'MB'#文件大小
else:
file_.size = str(KB)+'KB'#文件大小
file_.save()
return file_
视图层(views.py)
from rest_framework import viewsets
from .models import *
from .serializers import *
class FilesViewSet(viewsets.ModelViewSet):
"""
Author: czj
文件存储
"""
queryset = Files.objects.filter(deleted__exact='0')
serializer_class = FilesSerializer
permission_classes = [permissions.IsAuthenticated]
配置路由(urls.py)
urlpatterns = [
path('admin/', admin.site.urls),
]
# 定义DRF的API链接
# 使用basename可以解决drf路由被覆盖的问题
router = routers.DefaultRouter()
router.register(r'Files', PatrolSiteViews.FilesViewSet, basename='Files')#czj
最终效果