在drf中,序列化器已经对django的上传图片与写入文件进行了封装,更加简单。前端传递的格式必须是content_type=multipart/form-data
一、定义模型类:
• 图片字段使用ImageField
• 前端传递过来的图片接收之后需要对图片名做处理,当业务场景很大的时候,有可能会出现图片名重复的情况,后存入的数据库的图片会把先前同名的图片文件给覆盖掉,所以必须做处理。使用uuid来进行,返回文件名和相对路径,uuid唯一标识码,重名的概率极低。处理放在字段的upload中
需要特别注意的是:对文件名的处理在字段这里设置之后,不能同时在views.py文件中对这一字段进行重复设置,如果两个都设置了程序会报错:images:传入的内容不是文件,请检查编码格式

import uuid
#提取出公共的方法evaluation_directory_path获取图片后缀
# 使用uuid创建唯一的图片名,并保存的路径和文件名一并返回
def evaluation_directory_path(product_id, filename):ext = filename.split('.')[-1]filename = '{}.{}'.format(uuid.uuid4().hex[:10], ext)return os.path.join("evaluations", filename)
class ProductEvaluationImage(models.Model):evaluation = models.ForeignKey(ProductEvaluation, related_name="evaluation_images", on_delete=models.CASCADE, verbose_name="关联评论")images = models.FileField(null=True, blank=True, upload_to=evaluation_directory_path, verbose_name="商品评价图片")class Meta:verbose_name = "商品评价关联图"verbose_name_plural = verbose_namedef __str__(self):return self.evaluation.detail_content

二、视图中处理
• 图片文件的处理需要用到解析器,所以需要从drf中导入对应的解析器
• python3中获取post过来的图片文件是需要用到request.FILES.getlist(key)的方式来获取,必须是getlist
• 对图片图片列表进行遍历,创建序列化器,分别取出图片写入文件和添加到数据库字段中,序列化器会自动处理,不需要在自己编写程序写入文件。数据库字段只是写入文件的路径,二进制文件中存入的才是图片的内容

from rest_framework.parsers import JSONParser, MultiPartParser
class ProductEvaluationImageView(GenericAPIView):queryset = ProductEvaluationImage.objects.all()serializer_class = ProdcutEvaluationImageSerializersparser_classes = [JSONParser, MultiPartParser]def post(self, request):data = request.datafiles = request.FILES.getlist('images')product_id = request.data['product']for file in files:serializer = self.get_serializer(data={"images": file, "evaluation": data["evaluation"]})serializer.is_valid(raise_exception=True)serializer.save()return Response("获取成功", status=200)

三、序列化器

class ProdcutEvaluationImageSerializers(serializers.ModelSerializer):''' 用户评论关联图片序列化器 '''images = serializers.ImageField(max_length=None, use_url=True, allow_null=True, required=False)class Meta:model = ProductEvaluationImagefields = "__all__"

drf接收、处理上传图片并写入文件相关推荐

  1. linux bash 写入文件

    目录 方法1:echo 方法2:tee 方法1:echo 要将Bash命令的输出写入文件,可以使用右尖括号符号(>)或双右尖符号(>>): 右尖括号(>) 右尖括号号(> ...

  2. '800a0005' 图片上传出现写入文件失败的错误 -- 修改pload_5xsoft.inc

    一.基本问题 一般是文件写入的路径不对,或者是目录的权限没有设置好(必须对everyone或者来宾用户IIS_IUSRS设置为完全访问) 二.特殊问题 1.错误提示: ADODB.Stream 错误 ...

  3. MFC之CFile读取和写入文件

    MFC提供了CFile类方便文件的读写,首先要知道,文件的数据读取.数据写入与文件指针的操作都是以字节为单位的,数据的读取和写入都是从文件指针的位置开始的,当打开一个文件的时候,文件指针总是在文件的开 ...

  4. Android 系统日志写入文件

    目录介绍 1.业务需求 2.目前有那些做法及问题 3.自定义log工具类,一边打印日志一边写入文件 4.在application开启线程池进行日志打印 5.写一个service将系统日志写到文件 好消 ...

  5. FileStream写入文件

    写入文件     第一步:声明一个FileStream类的对象      FileStream fsWrite = new FileStream(string path, FileMode mode, ...

  6. python with open方式写入文件出现乱码问题解决

    一.问题描述 postman调用flask post接口,接口返回成功,成功修改数据,但是出现乱码 代码如下: server.py: mock接口实现接收url和data参数,再写入到csdn_moc ...

  7. HttpWebRequest FileStream分块读取和写入文件WebClient

    //HttpWebRequest  下载文件 private void DownloadFile(string filePath)           {               string[] ...

  8. java 写入文件流_Java实现文件写入——IO流

    输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流写入数据. ...

  9. Go-读取文件和写入文件三种方法的操作

    打开和关闭文件操作: os.Open()函数能够打开一个文件,返回一个*File和一个err.对得到的文件实例调用close()方法能够关闭文件. package main import (" ...

  10. python创建文件、写入文件、读取文件

    目录 os 模块与 os.path 模块 os模块 os模块的几种常用方法: os.path模块 os.path模块的几种常用方法: 文件--open()函数与file对象 open()方法 file ...

最新文章

  1. router路由react_使用React Router在React中受保护的路由
  2. 魔棒工具--RegionGrow算法简介
  3. 在博客园写了一年博客,收获的不仅仅是写作技能——我能一直保持积极的学习和工作态度...
  4. 现实世界的Windows Azure:采访Dot Net Solutions的首席执行官Dan Scarfe
  5. DL之Encoder-Decoder:Encoder-Decoder结构的相关论文、设计思路、关键步骤等配图集合之详细攻略
  6. 汇编语言——正数数组P和负数数组N
  7. 把一列数据分割成两列
  8. mysql 四大基础操作_mysql数据库的基本操作
  9. yaml文件解析:c++篇
  10. ubuntu软件源更换方法
  11. [JSOI2008]最大数maxnumber
  12. 代理商为何要卖增值业务?
  13. 问卷设计一:问卷题目哪些有类型和注意要点?
  14. 关于HTML预处理器Pug的使用文档
  15. 角度逼近圆弧插补法插补与仿真
  16. android 11 移除桌面搜索栏
  17. 【程序猿保健】ShaderJoy —— 拉力带教程
  18. 一对一辅导价格表初中_初中一对一辅导价格多少
  19. 电脑相机,万能相机电脑版
  20. 包含clob字段的数据入库sql怎么写

热门文章

  1. Golang面试问题汇总
  2. jsGannt Improved在vue中的使用
  3. [Scala的协变和逆变]
  4. python中backward是什么意思_python-PyTorch函数中的下划线后缀是什么意思...
  5. 谢耳朵最萌最贱表情, 哈哈
  6. 【Flutter小记3】Android打开前置或广角摄像头的同时打开闪光灯方案
  7. anconda各个版本下载
  8. 论文阅读 | Combating Adversarial Misspellings with Robust Word Recognition
  9. 西湖论剑 easyCpp writeup
  10. 如何根本上解决屎山代码的问题