text: from django.db import models
  
  from imagekit.models import ProcessedImageField
  from imagekit.models import ImageSpecField
  from imagekit.processors import Adjust, ResizeToFill, SmartCrop
  
  
  class ImageModel(models.Model):
      image = models.ImageField(upload_to='b')
  
  
  class Photo(models.Model):
      original_image = models.ImageField(upload_to='photos')
  
      # Implicit source field
      thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
                                 ResizeToFill(50, 50)], format='JPEG',
                                 options={'quality': 90})
  
      smartcropped_thumbnail = ImageSpecField([Adjust(contrast=1.2,
              sharpness=1.1), SmartCrop(50, 50)], source='original_image',
              format='JPEG', options={'quality': 90})
  
  
  class ProcessedImageFieldModel(models.Model):
      processed = ProcessedImageField([SmartCrop(50, 50)], format='JPEG',
              options={'quality': 90}, upload_to='p')
  
  
  class CountingCacheFileStrategy(object):
      def __init__(self):
          self.on_existence_required_count = 0
          self.on_content_required_count = 0
          self.on_source_saved_count = 0
  
      def on_existence_required(self, file):
          self.on_existence_required_count += 1
  
      def on_content_required(self, file):
          self.on_content_required_count += 1
  
      def on_source_saved(self, file):
          self.on_source_saved_count += 1
  
  
  class AbstractImageModel(models.Model):
      original_image = models.ImageField(upload_to='photos')
      abstract_class_spec = ImageSpecField(source='original_image',
                                           format='JPEG',
                                           cachefile_strategy=CountingCacheFileStrategy())
  
      class Meta:
          abstract = True
  
  
  class ConcreteImageModel(AbstractImageModel):
      pass
  
  
  class ConcreteImageModelSubclass(ConcreteImageModel):
      pass
  