Kombu.exceptions.EncodeError: Объект типа ShiftBooking не является JSON сериализуемым в Django 3.0

Я обновил свой проект с Django 1.8 tom Django 3.0

При отправке письма с подтверждением через celery я получаю эту ошибку

Django = 3.0

Python = 3.7

celery = 5.1.2

Вот мой views.py

class JobShiftCreateView(CreateView):
    template_name = 'contract_worker/job_shift_form.django.html'
    form_class = JobShiftForm
    context_object_name = "job_shift"
    model = ShiftBooking

    def get_context_data(self, **kwargs):
        ....
        ....
    def get_form_kwargs(self):
        ....
        ....
    def form_valid(self, form):
        addtional_days = form.cleaned_data['addtional_days']
        booked_with = form.cleaned_data['booked_with'] or None
        
        date = form.cleaned_data['date']
        location = form.cleaned_data['location']
        week_start = date - datetime.timedelta(days=(date.weekday()))
        x = datetime.datetime.strftime(week_start, '%d-%m-%Y')
        week_start = datetime.datetime.strptime(
            x, '%d-%m-%Y').strftime('%d-%m-%Y')

        self.object = form.save(commit=False)
        

        for i in range(0, int(addtional_days) + 1):
            self.object.pk = None
            if i == 0:
                days = 0
            else:
                days = 1
            date = date + datetime.timedelta(days=days)
            self.object.client = self.request.user.client
            self.object.created_by = self.request.user
            self.object.booked_with = booked_with
            
            self.object.date = date
            
            
            self.object.save()
        
        messages.success(self.request, 'Shift created successfully.')
        send_shift_mail_for_booking.delay(self.object, self.request.user)
    

Вот мой tasks.py

@celery_app.task(bind=True)
def send_shift_mail_for_booking(self, object, user):
    template_src = 'contract_worker/shift_confirmation_mail.html'
    template = get_template(template_src)
    from_email = settings.DEFAULT_FROM_EMAIL
    if user.client.email_validated_status == 'Validated':
        from_email = user.client.replay_to_email
    context = {
        'user': user,
        'client': user.client,
        'object': object

        }

    context = Context(context)
    html = template.render(context)
    subject = 'Shift offer from ' + '  ' + str(user) + '  '
    message = get_template('contract_worker/shift_confirmation_mail.html').render(Context(context))
    email = EmailMessage(subject, message, from_email, [object.worker_name.email])
    email.content_subtype = 'html'
    email.send()

вот трассировка моей ошибки

Вот мой код, я не могу понять, где я ошибаюсь, пожалуйста, помогите мне решить эту проблему

Код в вашем views.py :

send_shift_mail_for_booking.delay(self.object, self.request.user)

является первопричиной сообщения об исключении :

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

Задачи Celery работают с сериализаторами, каждый аргумент функции задачи Celery должен быть сериализуемым, что не верно в объекте класса модели Django ShiftBooking (the self.object).

Примечание: В основном разработчик приложения должен определить, как сделать экземпляр модели сериализуемым, написав дополнительный код (если только у вас уже нет библиотеки, делающей это)

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