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
).
Примечание: В основном разработчик приложения должен определить, как сделать экземпляр модели сериализуемым, написав дополнительный код (если только у вас уже нет библиотеки, делающей это)