django-imagekit - 缩略图字段未被序列化
我遇到了以下问题:
我正在用Django写一个AJAX视图,这个视图会提供关于图片列表的JSON数据,这些数据来自一个使用了Django-imagekit扩展的模型,这个模型里有一个叫做ImageSpecField
的字段:
class Image(models.Model):
title = models.CharField(max_length=120)
img = models.ImageField(upload_to="images")
thumb = ImageSpecField(source="img",
id="core:image:image_thumbnail"
)
objects = models.Manager()
json_data = JSONConvertibleManager()
这个模型使用了一个自定义的管理器来把数据转换成JSON格式,这个管理器叫做JSONConvertibleManager
,它使用的是Django自带的序列化工具(也就是django.core.serializers
的一个实例)。
我的问题是,除了ImageSpecField
字段之外,其他所有字段都能正常转换成JSON,但这个ImageSpecField
字段完全被忽略了。在序列化的时候,有没有办法返回instance.thumb.url
的值呢?
3 个回答
1
这是在@Insa给出的不错解决方案基础上做的小改进...
class PhotoSerializer(serializers.ModelSerializer):
original_image = serializers.SerializerMethodField()
class Meta:
model = Photo
fields = ('id', 'title', 'original_image')
def get_original_image(self, obj):
if bool(obj.original_image):
return self.context['request'].build_absolute_uri(obj.original_image.url)
return ''
这样可以获取缩略图的绝对网址,就像所有的图片字段默认那样。
3
很遗憾,之前被认可的答案现在不再适用了,因为DRF(可能是2.x版本)发生了变化。把这一行替换掉,就能在当前版本(3.5.3)中正常工作:
thumbnail = serializers.ReadOnlyField(source="thumbnail.url")
另外一种解决方案可以让你有更多的控制权(比如修改网址)是:
class PhotoSerializer(serializers.ModelSerializer):
original_image = serializers.SerializerMethodField()
class Meta:
model = Photo
fields = ('id', 'title', 'original_image')
def get_original_image(self, obj):
# some processing
return obj.original_image.url
5
只是给大家提供一些信息,我在使用Django Rest Framework,所以用了这个库里的序列化类。
我的模型:
class Photo(models.Model):
""" Photograph """
title = models.CharField(max_length=100)
slug = models.SlugField(max_length=255)
original_image = models.ImageField(upload_to='boxes')
formatted_image = ImageSpecField(source='original_image', format='JPEG',
options={'quality': 90})
thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(200, 115)], source='original_image',
format='JPEG', options={'quality': 90})
num_views = models.PositiveIntegerField(editable=False, default=0)
我的序列化器:
class PhotoSerializer(serializers.ModelSerializer):
original_image = serializers.Field('original_image.url')
thumbnail = serializers.Field('thumbnail.url')
class Meta:
model = Photo
fields = ('id', 'title', 'original_image', 'thumbnail',)