django的文件上传模块及重写创建实例

这里主要用到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

最终效果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isSamle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值