Невозможно обновить поле DateTimeField со значением None в Django
Фон
Я использую django-post-office для создания и постановки в очередь объектов электронной почты и использую команду send_queued_mail django (поставляется с модулем) для обработки поставленных в очередь писем. Я заметил ошибку, когда:
- MAX_RETRIES либо не установлен в настройках, либо установлен на 0
- При обработке очередей писем, по крайней мере, одно письмо не было отправлено. В моем случае это произошло из-за неправильного адреса получателя.
- Затем он использовал bulk_update для обновления неудачных писем, т.е.
Email.objects.bulk_update(emails_failed, ['status', 'scheduled_time', 'number_of_retries'])
- Значения, используемые для обновления emails_failed: 1,None,0 .
- Фрагмент ошибки -
django.db.utils.DataError: ('22018', '[22018] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Operand type clash: int is incompatible with datetime2 (206) (SQLExecDirectW); [22018] [Microsoft][ODBC Driver 17 for SQL Server][SQ L Server]Statement(s) could not be prepared. (8180)')
Я полагаю, что причиной ошибки является обновление столбца scheduled_time со значением None, поскольку он является DateTimeField, однако null=True установлен в модели Email. Пожалуйста, обратитесь к фрагменту ниже, чтобы увидеть схему модели Email (снова поставляется с модулем django-post-office)
Фрагмент модели электронной почты
scheduled_time = models.DateTimeField(_("Scheduled Time"),blank=True, null=True, db_index=True,help_text=_("The scheduled sending time"))
status = models.PositiveSmallIntegerField(_("Status"),choices=STATUS_CHOICES, db_index=True,blank=True, null=True)
number_of_retries = models.PositiveIntegerField(null=True, blank=True)
Версии
- Django==3.2.13
- Python==3.7
- django-post-office==3.6.0
- DB - SQL сервер
Вопросы
- Есть ли основания полагать, что исключение SQL возникает из-за значения None, используемого для обновления столбца schedule_time?
- Является ли это скорее проблемой БД SQL сервера, которая не позволяет Null в поле datetime?