在drf中,序列化器已经对django的上传图片与写入文件进行了封装,更加简单。前端传递的格式必须是content_type=multipart/form-data

一、定义模型类:

  • 图片字段使用ImageField
  • 前端传递过来的图片接收之后需要对图片名做处理,当业务场景很大的时候,有可能会出现图片名重复的情况,后存入的数据库的图片会把先前同名的图片文件给覆盖掉,所以必须做处理。使用uuid来进行,返回文件名和相对路径,uuid唯一标识码,重名的概率极低。处理放在字段的upload中

    需要特别注意的是:对文件名的处理在字段这里设置之后,不能同时在views.py文件中对这一字段进行重复设置,如果两个都设置了程序会报错:images:传入的内容不是文件,请检查编码格式

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

二、视图中处理

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

class ProductEvaluationImageView(GenericAPIView): queryset = ProductEvaluationImage.objects.all() serializer_class = ProdcutEvaluationImageSerializers parser_classes = [JSONParser, MultiPartParser]

  1. def post(self, request):
  2. data = request.data
  3. files = request.FILES.getlist('images')
  4. product_id = request.data['product']
  5. for file in files:
  6. serializer = self.get_serializer(
  7. data={"images": file, "evaluation": data["evaluation"]})
  8. serializer.is_valid(raise_exception=True)
  9. serializer.save()
  10. return Response("获取成功", status=200)
  1. <a name="bFCHF"></a>
  2. ### 三、序列化器
  3. ```python
  4. class ProdcutEvaluationImageSerializers(serializers.ModelSerializer):
  5. ''' 用户评论关联图片序列化器 '''
  6. images = serializers.ImageField(
  7. max_length=None, use_url=True, allow_null=True, required=False)
  8. class Meta:
  9. model = ProductEvaluationImage
  10. fields = "__all__"