Marcus Gabilheri
Marcus Gabilheri

Reputation: 1289

Django rest framework saving thumbnail image

I've recently started developing with django + python and everything was going very smooth until I got stuck into a problem that probably is very simple but I can not solve with my inexperience with the framework/language.

I'm receiving an JSON object through an HTTP Request which contains some data and 2 pictures. Prior to those 2 pictures I wanted to save a thumbnail from one of them but I don't see to get that task done. I can save all the data easily including the 2 images. But I can not see to find a way to generate a way an have that in the DB also, as well the folder structure that I want.

My folders should look like:

pictures
   user
      originals
      processed
      thumbnails
   otherUser
       originals
       processed
       thumbnails

My goal is: Receive 2 pictures, create a thumbnail from one of them and them save all 3 pictures in 3 separate folders and the path to the Database.

Here's how my model code looks like.

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

Serializer code...

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',)

View code...

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

I've tried many things such as easy_thumbnails, sorl_thumbnail, and some pre made methods on how to do it.. but I can't see to find a solution specific for what I've been wanting.

Thank you very much!

Upvotes: 2

Views: 1758

Answers (1)

Alex Lisovoy
Alex Lisovoy

Reputation: 6065

Looks like you have mistake in definition of the SomeDataSerializer. In model SomeData field original_image defined as ImageField, but in serialiser it's just Field, not ImageField. You should use correct field type:

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')
    ...

Upvotes: 1

Related Questions