从原始图像获取缩略图而无需手动输入缩略图 || Django 休息框架

getting thumbnail from original image without inputting that thumbnail image manually || Django Rest Framework

我在使用 Django REST Framework 的项目中发现了一个问题。在 'POST' 中,我将仅输入 1 个图像文件,但在 'GET' 中,我将获得该图像文件的文件路径,以及我将获得该图像调整大小版本的另一个文件路径.

在模型中,您会看到我们有两个图像字段。原始和缩略图。我们将仅在 original 字段中输入。但是缩略图 将由原始 字段中调整大小的图像自动填充。

型号:

class BookCover(models.Model):
     id = models.UUIDField(primary_key=True, max_length=36, default=uuid.uuid4)
     original = models.ImageField()
     thumbnail = ResizedImageField()

序列化程序:

class BookCoverSerializer(serializers.ModelSerializer):    
    class Meta:
        model = BookCover
        fields = "__all__"

观看次数(用于创建):

def create(self, request,*args, **kwargs):
    serializer = self.serializer_class(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(
            Msg.encode(201, "Saved Successfully", None, serializer.data)
            , status=status.HTTP_201_CREATED
        )
    return Response(
        Msg.encode(400, None, serializer.errors, None)
        , status=status.HTTP_400_BAD_REQUEST
    )

在这里,我们将输入原始图像,而不是缩略图。但在 table 中,我们将在缩略图字段中获得原始图像的调整大小版本。

我们该怎么做? 任何帮助将不胜感激。

首先,您应该确保序列化程序中的缩略图字段是 read_only,因为您明确希望它从 original 字段设置。

class BookCoverSerializer(serializers.ModelSerializer):
  class Meta:
    ...
    read_only_fields = ['thumbnail']

然后,您可以在序列化程序 .save() 方法中实现调整大小。作为示例(实现您自己的 resize_image 方法):

class BookCoverSerializer(serializers.ModelSerializer):
  ...
  def save(self, **kwargs):
    instance = super().save(**kwargs)
    instance.thumbnail = resize_image(instance.original)
    instance.save()
    return instance

一种更简单的方法是使用类似 Django VersatileImageField