1

I have following problem:

I'm writing an AJAX view in django that serves JSON data about image list from a model that uses ImageSpecField from django-imagekit extension:

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

The model uses custom manager for conversion into JSON (JSONConvertibleManager) using built-in Django serializer (instance of django.core.serializers).

My problem is that all the fields are properly serialized except for the ImageSpecField which is getting completely ommited. Is it possible to return instance.thumb.url value during serialization?

Konrad Wąsowicz
  • 422
  • 2
  • 6
  • 12

3 Answers3

5

Just for info I was using Django Rest Framework and so used the serializer class from that library.

My model:

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)

My serializer:

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',)
user1378735
  • 66
  • 1
  • 3
3

Unfortunately, the accepted answer does not work anymore due to changes in DRF (prob. v2.x). Substitute this line and it will work with current versions (3.5.3):

thumbnail = serializers.ReadOnlyField(source="thumbnail.url")

Another solution to have more control (e.g. url modifications) would be:

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
Insa
  • 1,610
  • 12
  • 17
1

A little improvement based on the nice solution given by @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 ''

to obtain the absolute url for the thumbnail, as happens by default for all ImageFields

Mario Orlandi
  • 5,629
  • 26
  • 29