Django Rest Framework上传原图自动生成缩略图的实现方法咨询
实现方案
1. 修改序列化器,将thumbnail设为只读字段
首先调整序列化器配置,避免POST请求时校验thumbnail字段为必填,同时GET请求可以正常返回缩略图路径:
class BookCoverSerializer(serializers.ModelSerializer): class Meta: model = BookCover fields = "__all__" # 新增如下配置,设置thumbnail为只读,不需要前端传入 read_only_fields = ["thumbnail"]
2. 重写模型save方法,自动生成缩略图
你用到的ResizedImageField本身自带缩放能力,只需要在模型保存时自动把原图赋值给thumbnail字段,即可自动完成缩放存储,不需要手动处理图片逻辑:
import uuid from django.db import models from django_resized import ResizedImageField class BookCover(models.Model): id = models.UUIDField(primary_key=True, max_length=36, default=uuid.uuid4) # 建议添加upload_to参数分类存储原图,避免文件目录混乱 original = models.ImageField(upload_to="cover/original/") # 提前指定缩略图尺寸,同时允许字段为空 thumbnail = ResizedImageField(size=[200, 200], upload_to="cover/thumbnail/", blank=True) def save(self, *args, **kwargs): # 仅当存在原图、且还未生成缩略图时才执行生成逻辑,避免重复覆盖 # 如果需要每次更新原图都重新生成缩略图,删掉`and not self.thumbnail`判断即可 if self.original and not self.thumbnail: self.thumbnail = self.original super().save(*args, **kwargs)
如果你需要自定义缩放规则(比如裁剪、自定义画质等),可以直接修改ResizedImageField的参数,支持quality、crop等配置项。
3. 视图无需修改
原有视图的创建逻辑可以直接复用,POST请求仅需传入original对应的图片文件即可,接口返回结果会自动携带原图和缩略图的访问路径。
内容的提问来源于stack exchange,提问作者Mohammad Shikhar
相关产品推荐
相关产品推荐

