Ошибка кодировщика Celery с фреймворком django rest

Я использую Celery - Redis - Django rest framework вместе. Ошибка происходит, когда я пытаюсь передать сериализатор в задержку Celery в рамках Django rest framework.

Вот набор представлений

class TestSet(viewsets.ModelViewSet):
    queryset = Test.objects.all()
    serializer_class = ImageSerializer

    def create(self, request, *args, **kwargs):
         serializer = TestSerializer(data=request.data)

        if serializer.is_valid():
            print("I AM HERE") <-- This prints out
            result = test_call.delay(serializer) <-- The error happens here
            data = {"task": result.task_id}
            return Response(data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@shared_task(name="values")
def test_call(serializer):
    ..some logic
    return serializer

Ошибка, которую я получаю

kombu.exceptions.EncodeError: Object of type ImageSerializer is not JSON serializable

У меня есть следующее в settings.py

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

Это не ответит на ваш вопрос, но я не могу оставить комментарий (низкая репутация).

Похоже, что вы пытаетесь сериализовать в JSON то, что, очевидно, не является сериализуемым в JSON. Судя по названию, это какие-то данные изображения. Вы можете попробовать другой рабочий процесс, который должен быть JSON Serializable, например:

Один пример:

  1. сначала сохраните изображение в доступном месте и добавьте местоположение в сериализатор (S3 bucket, а затем ссылку на изображение)
  2. В вашей задаче celery, получите данные изображения на основе этого местоположения

Второй пример:

  1. преобразуйте данные изображения во что-то JSON сериализуемое, как строка изображения Base64

ну вы передаете экземпляр сериализатора в задачу, вы должны передать его данные:

    ...
    if serializer.is_valid():
        print("I AM HERE") <-- This prints out
        result = test_call.delay(serializer.data) # change this line
        data = {"task": result.task_id}
   ...
Вернуться на верх