Skip to main content
 首页 » 编程设计

python之Django 休息框架保存缩略图

2025年05月04日24lexus

我最近开始使用 django + python 进行开发,一切都非常顺利,直到我遇到了一个可能非常简单但由于我对框架/语言缺乏经验而无法解决的问题。

我通过 HTTP 请求接收一个 JSON 对象,其中包含一些数据和 2 张图片。在这两张照片之前,我想保存其中一张的缩略图,但我看不到完成这项任务。我可以轻松保存所有数据,包括 2 张图像。但是我看不到找到一种方法来生成一种方法,也可以在数据库中使用它,以及我想要的文件夹结构。

我的文件夹应该是这样的:

pictures 
   user 
      originals 
      processed 
      thumbnails 
   otherUser 
       originals 
       processed 
       thumbnails 

我的目标是:接收 2 张图片,从其中一张创建缩略图,然后将所有 3 张图片保存在 3 个单独的文件夹和数据库路径中。

这是我的模型代码的样子。

class SomeData(models.Model): 
    owner = models.ForeignKey('auth.User', related_name='canopeo_data') 
    adjustments = models.CharField(max_length=10) 
    latitude = GeopositionField() 
    longitude = GeopositionField() 
    notes = models.TextField(null=True, blank=True) 
    original_image = models.ImageField(upload_to=original_image, max_length=255, blank=True) 
    processed_image = models.ImageField(null=False, upload_to=processed_image, max_length=255) 
    thumbnail_image = models.ImageField(null=False, upload_to=thumbnail_image, max_length=255) 
    date_time = models.DateTimeField(auto_now_add=True) 
 
    class Meta: 
        ordering = ('date_time',) 
 
    def save(self, *args, **kwargs): 
        super(SomeData, self).save(*args, **kwargs) 
 
def original_image(self, filename): 
    url = "pictures/%s/originals/%s" % (self.owner.username, filename) 
    return url 
 
 
def processed_image(self, filename): 
    url = "pictures/%s/processed/%s" % (self.owner.username, filename) 
    return url 
 
 
def thumbnail_image(self, filename): 
    url = "pictures/%s/thumbnail/%s" % (self.owner.username, filename) 
    return url 

序列化器代码...

class SomeDataSerializer(serializers.HyperlinkedModelSerializer): 
#url = serializers.HyperlinkedRelatedField(view_name='data', format='html') 
owner = serializers.Field(source='owner.username') 
thumbnail_image = serializers.Field(source='original_image') 
 
class Meta: 
    model = SomeData 
    fields = ('url', 'adjustments', 'latitude', 'longitude', 'notes', 'original_image', 'processed_image',) 

查看代码...

class SomeDataViewSet(viewsets.ModelViewSet): 
queryset = SomeData.objects.all() 
serializer_class = SomeDataSerializer 
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 
 
def pre_save(self, obj): 
    obj.owner = self.request.user 

我已经尝试了很多东西,例如 easy_thumbnails、sorl_thumbnail 和一些预制的方法。但是我无法找到适合我一直想要的解决方案。

非常感谢!

请您参考如下方法:

看起来您在 SomeDataSerializer 的定义中有错误。在模型 SomeData 字段 original_image 中定义为 ImageField,但在序列化程序中它只是 Field,而不是 ImageField .您应该使用正确的字段类型:

class SomeDataSerializer(serializers.HyperlinkedModelSerializer): 
    #url = serializers.HyperlinkedRelatedField(view_name='data', format='html') 
    owner = serializers.Field(source='owner.username') 
    thumbnail_image = serializers.ImageField(source='original_image') 
    ...