django-imagekit - 缩略图字段未被序列化

时间:2014-08-11 10:06:40

标签: python json django serialization django-imagekit

我有以下问题:

我正在django中编写一个AJAX视图,该视图从使用来自django-imagekit扩展的ImageSpecField的模型提供有关图像列表的JSON数据:

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()

该模型使用自定义管理器,使用内置的Django序列化程序(JSONConvertibleManager的实例)转换为JSON(django.core.serializers)。

我的问题是所有字段都已正确序列化,除了完全省略的ImageSpecField。是否可以在序列化期间返回instance.thumb.url值?

3 个答案:

答案 0 :(得分:3)

仅供参考,我使用的是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',)

答案 1 :(得分:1)

不幸的是,由于DRF(prob.v2.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

答案 2 :(得分:0)

基于@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 ''

获取缩略图的绝对URL,默认情况下,所有ImageField都将发生