Django и Celery: не удается выполнить задачу kombu.exceptions.EncodeError

У меня есть асинхронная задача Celery recalculate_emissions_task.delay(assessment, answers,reseller, user)

где параметрами являются все объекты Django, моя функция задачи определена следующим образом

@app.task @transaction.atomic

def recalculate_emissions_task(assessment, answers, reseller, requesting_user=None):
    for ans in answers:
        approver = None
        if ans.is_approved:
            approver = ans.approver
            auto_approved = ans.auto_approved
            auto_approval_notes = ans.auto_approval_notes
            ans.unapprove()

        ans.report_upstream_emissions = ans.scope in assessment.scopes_for_upstream
        ans.report_transmission_and_distribution = assessment.report_transmission_and_distribution
        ans.for_mbi_assessment = assessment.uses_mbi

        if approver:
            ans.approve(
                approver,
                auto_approved=auto_approved,
                auto_approval_notes=auto_approval_notes
            )
        else:
            ans.save()

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

Traceback (most recent call last):
  File "dir/bin/django-python.py", line 18, in <module>
    runpy.run_path(path, run_name='__main__')
  File "/usr/lib/python3.8/runpy.py", line 265, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/usr/lib/python3.8/runpy.py", line 97, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "test.py", line 15, in <module>
    recalculate_emissions_task.delay(assessment, answers,reseller, user)
  File "dir/lib/python3.8/site-packages/celery/app/task.py", line 427, in delay
    return self.apply_async(args, kwargs)
  File "dir/lib/python3.8/site-packages/celery/app/task.py", line 566, in apply_async
    return app.send_task(
  File "dir/lib/python3.8/site-packages/celery/app/base.py", line 756, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "dir/lib/python3.8/site-packages/celery/app/amqp.py", line 543, in send_task_message
    ret = producer.publish(
  File "dir/lib/python3.8/site-packages/kombu/messaging.py", line 167, in publish
    body, content_type, content_encoding = self._prepare(
  File "dir/lib/python3.8/site-packages/kombu/messaging.py", line 252, in _prepare
    body) = dumps(body, serializer=serializer)
  File "dir/lib/python3.8/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/lib/python3.8/contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)
  File "dir/lib/python3.8/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "dir/lib/python3.8/site-packages/vine/five.py", line 194, in reraise
    raise value.with_traceback(tb)
  File "dir/lib/python3.8/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "dir/lib/python3.8/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "dir/lib/python3.8/site-packages/kombu/serialization.py", line 350, in pickle_dumps
    return dumper(obj, protocol=pickle_protocol)
kombu.exceptions.EncodeError: Can't pickle local object 'Answer._lazy_build_emissions.<locals>.fn'

При синхронном выполнении задачи ошибок не возникает. Заранее спасибо

Вернуться на верх