I was wondering how I can use Celery workers to handle file uploads. So I tried implementing it on a simple class. I overrided the create class in my ModelViewSet. But apparently Django's default json encoder does not serialize ImageFields (Lame). I'll really appreciate it if you guys could tell me how I can fix this. Here is what I came up with:
serializers.py:
class ProductImageSerializer(serializers.ModelSerializer):
class Meta:
model = ProductImage
fields = ['id', 'image']
tasks.py:
from time import sleep
from celery import shared_task
from .models import ProductImage
@shared_task:
def upload_image(product_id, image):
print('Uploading image...')
sleep(10)
product = ProductImage(product_id=product_id, image=image)
product.save()
views.py:
class ProductImageViewSet(ModelViewSet):
serializer_class = ProductImageSerializer
def get_queryset(self):
return ProductImage.objects.filter(product_id=self.kwargs['product_pk'])
def create(self, request, *args, **kwargs):
product_id = self.kwargs['product_pk']
image = self.request.FILES['image']
image.open()
image_data = Image.open(image)
upload_image.delay(product_id, image_data)
return Response('Thanks')
and here's the my model containing my ImageField:
class ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images')
image = models.ImageField(upload_to='store/images', validators=[validate_image_size])