Django Import-Export import error - localtime() cannot be applied to a naive datetime
Используется:
Python 3.10.4
.
Django 4.06
Django-import-export 2.8.0
Я пытаюсь импортировать данные для использования в качестве демонстрационных данных в моем приложении django. Я продолжаю получать ошибку localtime() cannot be applied to a naive datetime (после решения другой ошибки, о которой я спрашивал отдельно). Я не беспокоюсь о том, что это конкретное поле является наивным временем. Это то, что должно быть установлено вручную в реальном приложении.
### models.py
class Reservation(models.Model):
reservation = models.OneToOneField(Vehicle, on_delete=models.CASCADE, primary_key=True,)
delivered = models.BooleanField('Delivered',default=False)
date_reserved = models.DateTimeField('date reserved', default=datetime.datetime.now)
...
### admin.py
class ReservationResource(resources.ModelResource):
class Meta:
model = Reservation
exclude = ('id',)
import_id_fields = ('reservation',)
fields = (
'reservation',
'delivered',
'date_reserved',
...
)
class ReservationImportExport(ImportExportModelAdmin):
resource_class: ReservationResource
@admin.register(Reservation)
class ReservationAdmin(SimpleHistoryAdmin, ReservationImportExport):
fields = ["delivered","date_reserved",...]
### demo-reservations.yaml (Note: Problem happens using different data file formats)
- reservation: 50001
delivered: False
date_reserved: 7/15/2022T00:00:00+00:00
...
Вот ошибка (слегка завуалированная)
Line number: 1 - localtime() cannot be applied to a naive datetime
50001, False, 7/15/2022T00:00:00+00:00, CHRIS EDWARDS, 16, ROSE TYLER
Traceback (most recent call last):
File "c:\Users\...\lib\site-packages\import_export\resources.py", line 670, in import_row
diff = self.get_diff_class()(self, original, new)
File "c:\Users\...\lib\site-packages\import_export\resources.py", line 221, in __init__
self.left = self._export_resource_fields(resource, instance)
File "c:\Users\...\lib\site-packages\import_export\resources.py", line 242, in _export_resource_fields
return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()]
File "c:\Users\...\lib\site-packages\import_export\resources.py", line 242, in <listcomp>
return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()]
File "c:\Users\...\lib\site-packages\import_export\resources.py", line 882, in export_field
return field.export(obj)
File "c:\Users\...\lib\site-packages\import_export\fields.py", line 125, in export
return self.widget.render(value, obj)
File "c:\Users\...\lib\site-packages\import_export\widgets.py", line 236, in render
value = timezone.localtime(value)
File "c:\Users\...\lib\site-packages\django\utils\timezone.py", line 206, in localtime
raise ValueError("localtime() cannot be applied to a naive datetime")
ValueError: localtime() cannot be applied to a naive datetime
Уже пробовали:
- Удалили SimpleHistoryAdmin из регистрации администратора
- Изменили поле импорта на просто 7/15/2022
- Удаление поля из файла импорта полностью
Спасибо всем!
Простите, я читал внимательнее:
date_reserved = models.DateTimeField('date reserved', default=datetime.datetime.now)
Это вызывает вашу ошибку. Не обязательно устанавливать значение по умолчанию, можно поступить следующим образом:
models.DateTimeField(auto_now_add=True)
который добавляет текущее время (aware), как вы пытаетесь сделать здесь.
Вот мой старый ответ для протокола:
from django.utils import timezone
tz = timezone.get_current_timezone()
aware_datetime = timezone.make_aware(datetime_object, tz)
Этот код должен решить вашу проблему. Вам нужно разобрать строку дата-время и вставить ее в make_aware
Вы можете сделать что-то вроде этого, если вы все еще используете только дату:
from datetime import datetime
datetime_object = datetime.strptime("7/15/2022", "%m/%d/%Y")
- Вот ссылка на документацию Django, объясняющая make_aware
- Вот ссылка, объясняющая get_current_timezone (и почему она может даже не понадобиться, если вы указали Timezone в вашем settings.py)
Вы также можете добавить функцию в вашу модель, которая автоматически преобразует наивные даты в известные времена, проверьте этот ответ, если вы хотите реализовать это